Робота з декількома шаблонами

Лекція № 8

Тема: Життєвий цикл шаблону документа

План

1. Життєвий цикл шаблону документа

2. Особливості роботи з шаблонами

3. Робота з декількома шаблонами

4. Недокументований клас CDocManager

5. Видалення шаблонів, доданих за допомогою функції AddDocTemplate

 

Життєвий цикл шаблону документа

Як можна здогадатися, CSingleDocTemplate — достатньо легковагий (lightweight) клас (під цим автор має на увазі, що об'єкт даного класу займає в пам'яті дуже мало місця). Крім того, розробник може не піклуватися про пошук і зберігання класів шаблону документа, навіть якщо їх ціла дюжина.

Класи CSingleDocTemplate і CMultiDocTemplate використовуються виключно середовищем виконання додатку. Встановивши і завантаживши шаблон, додаток використовує його для управління документом, уявленням і об'єктами фреймових вікон, але маніпулювати шаблоном безпосередньо при цьому не потрібно. Як вже мовилося, додаток повинен реєструвати всі шаблони документа, які воно використовує, в коді функції-члена CWinApp::Initlnstance. В результаті до відкритих (public) членів даного об'єкту додатку можна звернутися ззовні, а також (при необхідності) маніпулювати документами і уявленнями.

Роздумуючи про шаблони документа і управління ними, можна прийти до висновку, що краще всього представити бібліотеці MFC виконання цієї роботи самостійно. Іншими словами, в об'єкті шаблону документа необхідно звернутися до коду бібліотеки MFC із запитом на створення необхідного уявлення або документа. У добре продуманому застосуванні практично ніколи не доводиться створювати свої власні уявлення, документи і фрейми — всю цю роботу шаблони документа виконують самостійно.

Особливості роботи з шаблонами

Освоївши основи концепції шаблонів, можна перейти до розгляду перспектив застосування шаблонів в проекті реального застосування. Властивості реального застосування диктують, в основному, конкретні умови його застосування. Наприклад, якщо користувачам доводиться виконувати великий об'єм роботи, щоб отримати представлення даних в необхідному вигляді, то вони швидко розчаруються в такому застосуванні. Але буде ще гірше, якщо представлення додатку не зможуть відобразити інформацію в інтуїтивно зрозумілому для користувача вигляді. Таке застосування виявиться незграбним, оскільки користувачам доведеться витрачати дуже багато час на обдумування того, як здійснити ту або іншу операцію, а не фактично виконувати необхідну роботу, використовуючи додаток.

Безумовно, таке виняткове середовище виконання додатків як та, яку створює майстер AppWizard, дуже хороша, щоб залишити без уваги потреби більшості додатків. Навіть після деякої модифікації код MFC продовжує залишатися сумісним із стандартними методами і підтримувати стандартний, а отже інтуїтивно зрозумілий користувачам інтерфейс.

Якщо для додатку зареєстровано декілька різних шаблонів документа, то при виборі користувачем в меню File пункту New воно повинне надавати додаткове діалогове вікно, що дозволяє вибрати необхідний тип документа. Ті, хто хоч раз скористався перевагою цієї можливості, ймовірно знайдуть немало областей застосування здатності додатку змінювати свою поведінку.

Робота з декількома шаблонами

Додаток MFC, що реалізовує архітектуру документ/уявлення, може використовувати в процесі виконання декілька шаблонів. Зазвичай, всі необхідні шаблони додаток створює в процесі виконання функції CWinApp::Initlnstance. Коли майстер AppWizard створює додаток, він додає в код цієї функції операторів, що створюють і реєструючі шаблон для пари документ/уявлення, використовуваною додатком за умовчанням.

Якщо в додатку необхідно використовувати додатковий документ або уявлення, або їх комбінацію, то для створення шаблону, відповідного новим парам документ/уявлення, доведеться додати додатковий код. Це істотно спростить створення екземпляра пари при призначеному для користувача запиті. Створюваний екземпляр класу, похідного від CDocTemplate, – це не більш, ніж звичайний об'єкт. Подібно до всіх останніх об'єктів його можна створити за допомогою оператора new і отримати при цьому покажчик на нього. Зазвичай отримані покажчики на шаблони документа зберігають як дані у складі об'єкту застосування (екземпляра класу, похідного від CWinApp). Це дозволяє звернутися до покажчика (а отже і до об'єкту) практично з будь-якого місця програми, у будь-який момент часу.

Кожен шаблон, що реєструється за допомогою функції CWinApp::AddDocTemplate, зберігається в зв'язаному списку (Jinked list). Класи MFC використовують цей список для пошуку шаблону у тому випадку, коли отримують від користувача запит на створення нового документа або уявлення, а також у разі виконання будь-якої операції, в ході якої додатку доведеться шукати необхідний шаблон документа. Наприклад, при виклику функції CWinApp::OnFileNew в додатку, що підтримує декілька шаблонів документа, середовищу виконання доведеться відобразити список, що розкривається, дозволяє користувачеві вибирати шаблон для типу створюваного документа.