69288

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

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-10-02

47 KB

0 чел.

Лекція № 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 в додатку, що підтримує декілька шаблонів документа, середовищу виконання доведеться відобразити список, що розкривається, дозволяє користувачеві вибирати шаблон для типу створюваного документа.

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

Зв'язаний список шаблонів управляється внутрішнім екземпляром класу колекції MFC на ім'я CDocManager. Цей класс— недокументована можливість реалізації MFC. Проте, розуміння принципу дії даного класу може виявитися дуже корисним. Екземпляр цього класу створює в додатку об'єкт класу, похідного від CWinApp. Об'єкт класу CWinApp містить покажчик на об'єкт класу CDocManager. Перед завершенням роботи додаток викликає функцію-деструкцію класу CWinApp, яка видаляє всі об'єкти, створені під час виконання додатку (у тому числі і об'єкт CDocManager). Об'єкт CWinApp зберігає цей покажчик в змінній-членові m_pDocManager. Фактично, щоб дістати доступ до диспетчера документа, покажчик можна використовувати у будь-який момент.

Першорядним завданням диспетчера документів (document manager) є управління зв'язаним списком об'єктів шаблону. Диспетчер документів зберігає список у відкритій (public) змінній-членові m_TemplateList. Для перебору елементів списку можна використовувати код, подібний наступному:

void CSampleWinApp::IterateEveryTemplate ()

{

CDocManager* pManager = AfxGetApp()->m_pDocManager;

 if (pManager == NULL) return;

POSITION pos = pManager->GetFirstDocTeraplatePosition();

while (pos != NULL)

{

// отримати наступний шаблон

CDocTemplate* pTemplate =pManager->GetNextDocTemplate(pos);

// тепер з даним покажчиком можна працювати

DoSomething(pTemplate);

}

}

Однією з найбільш важливих переваг, які забезпечує список шаблонів, є можливість отримання списку всіх активних документів. Для цього застосовується два цикли, вкладених один в одного. Перший цикл перебирає всі виявлені шаблони, а другий — всі документи, створені із застосуванням даного шаблону. Код, що реалізовує цю можливість, може виглядати таким чином:

void CSampleWinApp::IterateEveryDocument()

{

CDocManager* pManager = AfxGetApp()->m_pDocManager;

if (pManager == NULL) return;

POSITION posTemplate = pManager->GetFirstDocTemplatePosition();

while (posTemplate != NULL) {

// отримати наступний шаблон

CDocTemplate* pTemplate 

= pManager->GetNextDocTemplate(posTemplate);

POSITION posDoc = pTemplate->GetFirstDocPosition{);

while (posDoc != NULL) {

CYourDocument* pThisOne 

= (CSampleDocument*) GetNextDoc(posDoc);

// тут можна обробити кожен документ

pThisOne->SomeFunctionCall();

}

}

}

У обох фрагментах коди, щоб отримати покажчик диспетчер, спочатку слід звернутися до функції AfxGetApp і отримати покажчик на об'єкт додатку. Потім із змінної-члена m_jDDocManager отримуємо покажчик на диспетчер шаблонів. Фактично, це дещо більше, ніж просто привласнення, оскільки дані фрагменти коди є функціями-членами класу CSampleWinApp; тому цілком імовірно, що вони виявляться членами об'єкту, отриманого при зверненні до функції AfxGetApp. В принципі, замість цього можна було б звернутися до змінної-члена m_pDocManager безпосередньо. Але у зв'язку з очевидною неефективністю такого підходу використовуваний для доступу до інформації про об'єкт застосування, що виконується, функцію AfxGetApp.

Фрагменти коди, використовуючі функції-члени GetFirstDocTeraplatePosition і GetNextDocTemplate класу CDocManager, повинні виглядати знайомо, оскільки виконувані ними дії схожі на дії функцій-членів GetFirstViewPosition і TetNextView класу CDocument, який розглядався раніше. Основну роботу виконує функція GetNextDocTemplate, одержуюча покажчик на наступний документ (покажчик типу POSITION). Як можна відмітити, тут застосовується приведення типів часу виконання (runtime casting), оскільки перший фрагмент коди повинен передавати в другій покажчики на прості об'єкти класу CDocument як покажчики на клас CSampleDocument. Це був би дуже хороший привід продемонструвати застосування функції IsKindOf або макрокоманди бібліотеки MFC DYNAMIC_DOWNCAST, що дозволяють упевнитися в тому, що в результаті дійсного було отримано те, що і очікувалося. Але для простоти викладу код прикладів довелося скоротити.

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

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

При розробці додатку про зберігання використовуваних шаблонів можна не піклуватися; як уже згадувалося, вони не займають багато місця. Подібно до всіх останніх об'єктів, шаблони підкоряються загальноприйнятим правилам. Наявність тисяч шаблонів в одному застосуванні — це вже занадто (і нічний кошмар для програміста), але, ймовірно, десять - двадцять шаблонів, здатних забезпечити зручність роботи з додатком, не буде обтяжливі.


 

А также другие работы, которые могут Вас заинтересовать

25981. АУДИТ УЧЕТА ФИНАНСОВЫХ РЕЗУЛЬТАТОВ И ИХ ИСПОЛЬЗОВАНИЯ 35.5 KB
  Выручка от продукции реализованной на сторону отражается прежде всего на счете 90. Кроме того на данном счете отражается себестоимость реализованной продукции которая включает в себя: себестоимость готовой продукции и полуфабрикатов собственного производства; себестоимость работ и услуг промышленного характера; стоимость покупных изделий; стоимость строительномонтажных и проектноизыскательских работ; стоимость товаров; расходы по перевозке грузов; транспортноэкспедиционные расходы на погрузочноразгрузочные работы; услуги связи; зарплата...
25982. Аудит учета финансовых вложений 40.5 KB
  Законодательные и нормативные документыПри учете и аудите финансовых вложений необходимо руководствоваться следующими законодательнонормативными документами:1. Положение по бухгалтерскому учету Учет финансовых вложений ПБУ 19 02 утвержденное приказом Минфина России от 10. Методические указания по инвентаризации имущества и финансовых обязательств приказ Минфина России от 13 июня 1995 г.
25983. Философия Гераклита. Принципы диалектики. Диалектика и метафизика 25.3 KB
  Принципы диалектики. Согласно его рассуждениям мудрый тот кто не дает названия предметамони меняются Основные принципы диалектики. Гегель расширил понимание диалектики вывел ее из рамки движения мыслиувидел столкновение и объединение противоположностей в самой действительности в истории в культуре. В современных вариантах диалектики практически отсутствует понимания ее как о развитии.
25984. Философия и жизнь Сократа 19.09 KB
  Философия и жизнь Сократа О жизни и деятельности Сократа одного из величайших философов Древней Греции можно узнать лишь по произведениям его современников и учеников в первую очередь Платона потому что сам Сократ письменных источников после себя не оставил. Платон же познакомился с Сократом за восемь лет до гибели последнего когда Сократу было уже за шестьдесят и встреча эта произвела революцию в душе будущего знаменитого философа. Платон же написал и Апологию Сократа из которой можно узнать о некоторых аспектах сократовской...
25985. Платон. Сущность философского идеализма 18.03 KB
  Выделить в творчестве Платона какойлибо аспект и систематически изложить его довольно сложно так как приходится реконструировать мысли Платона из отдельных высказываний которые настолько динамичны что в процессе эволюции мысли порой превращаются в свою противоположность.Систематическое широкое использование математического материала имеет место у Платона начиная с диалога Менон где Платон подводит к основному выводу с помощью геометрического доказательства. Значительно в большей мере чем в гносеологии влияние математики...
25986. Философия Аристотеля, ученого-энциклопедиста 38.02 KB
  Проблема человека Познание человека центральная проблема философии. Стремление человека познавать свою собственную природу является одним из главных стимулов развития философии мысли. В современной науке насчитывается более 800 дисциплин изучающих человека. неделимый соединяет в себе черты: 1 ОБЩЕЧЕЛОВЕЧЕСКИЕ присущие всем людям как членам человеческого рода вида homo sapiens; 2 СОЦИАЛЬНОТИПИЧЕСКИЕ свойственные ему как представителю конкретного общества определенной культуры народа социальной группы; 3 ИНДИВИДУАЛЬНЫЕ...
25987. Философия эллинизма 20.28 KB
  Жизнь и деятельность ВойноЯсенецкого. ВойноЯсенецкого Валентин Феликсович ВойноЯсенецкий родился в 1877 г. Его отец провизор Феликс Станиславович ВойноЯсенецкий происходил из известного с 16 века обедневшего дворянского рода. Отец ВойноЯсенецкого был католиком мать Мария Дмитриевна Кудрина православной.
25988. Основные принципы философии средневековья. Номинализм и реализм 16.6 KB
  Основные принципы философии средневековья. Возникновение средневековой философии очень частосвязывают с падением Западной Римской империи 476 год н. В средневековой философии напротив реальностью определяющей все сущщее есть Бог.э конкурируют между собой философские учения стоиков эпикурейцев неоплатоников и в это же время формируются очаги новой веры и мысли которые в последствии составят основу средневековой философии.
25989. Философия Фомы Аквинского, Наука в жизни общества 32.58 KB
  Платоническое представление Августина о человеческой душе как независимой от тела духовной субстанции обладающей способностью непосредственно усматривать вечные несотворенные истины Идеи в свете Божественного просвещения Фома заменяет восходящим к Аристотелю понятием души как формы тела. Воздействие объектов приводит к образованию в душе их чувственных образовподобий от которых интеллект абстрагирует умопостигаемые формы универсалии следы творения вещей с помощью Божественных Идей. разумная часть человеческой души являются...