69285

Документи і обробка повідомлень

Лекция

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

Одне з найбільш важливих достоїнств документа в тому, що об’єкт CDocument не пов’язаний з вікном безпосередньо. Проте, саме об’єкт CDocument і є адресатом передаваних команд. Отже, цей об’єкт може отримувати повідомлення від операційної системи. Відповідальність за передачу повідомлень...

Украинкский

2014-10-02

34.5 KB

0 чел.

Лекція № 5

Тема: Документи і обробка повідомлень

План

  1.  Документи і обробка повідомлень
  2.  Перевизначення віртуальних функцій документа

Документи і обробка повідомлень

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

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

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

На практиці розділення обов'язків між документом і уявленням, як правило, спрощує обробку команд. Наприклад, якщо додаток забезпечує виконання команди Save (Зберегти), що віддається користувачем при необхідності збереження даних об'єкту, то виконувати її повинен саме документ, оскільки команда має відношення до самих даних, а не до їх відображення.

З іншого боку, якщо додаток підтримує команду Copy (Копіювати), яку користувач зазвичай віддає за допомогою контекстного меню при необхідності копіювання даних з екрану, то виконувати її повинен, ймовірно, об'єкт уявлення. Таким чином, якщо документ володіє декількома уявленнями, то дані, скопійовані в одному з уявлень, можуть істотно відрізнятися від даних другого. Тому, для кожного уявлення пов'язаного з документом, обробка команди Copy повинна виконуватися по-своєму.

Відмінності цілком очевидні — в першому зберігаються дані документа, а в другому копіюються дані уявлення. Але, існують і проміжні випадки. Хороший приклад — команда Paste (Вставити). Питання про те, чи повинен виконувати команду Paste клас документа або клас уявлення, складніший, оскільки дана команда впливає на весь документ в цілому. Це пов'язано з тим, що дані необхідно вставити в сам документ а не просто в окреме уявлення. З іншого боку, поточне уявлення також може істотно вплинути на результат вставки інформації в документ. Наприклад, команда Paste може замінити вже існуючий текст, виділений зараз в уявленні. Іншими словами, рішення про той, хто саме (об'єкт документа або об'єкт уявлення) повинен виконувати дії цього типу, залежить від конкретного проекту додатку. В більшості випадків, це саме те рішення, яке необхідно обдумати особливо ретельно.

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

Перевизначення віртуальних функцій документа

Як мовилося раніше, функції OnNewDocument і Serialize є віртуальними, а отже, перед застосуванням їх необхідно перевизначити (override). Не дивлячись на те, що відповідні функції-члени базового класу CDocument володіють стандартною поведінкою, достатньою для більшості випадків, іноді виникає необхідність в спеціальній обробці документа, яку базові функції безумовно не виконують.

Наприклад, клас CDocument і класи, похідні від нього, викликають функцию-член OnNewDocument() всякий раз, коли програма ініціалізувала новий об'єкт документа (або коли вона багато разів використовує існуючий об'єкт документа в додатку SDI). Зазвичай в додатку виклик функції OnNewDocument здійснюється при виборі в меню File (Файл) пункту New (Створити). Аналогічно, клас CDocument викликає функцию-член OnCloseDocument, перш ніж додаток закриє документ. Якщо в створених користувачем класах документа перед завершенням роботи додатку і видаленням об'єкту документа необхідно виконати які-небудь дії (очистити зайняту пам'ять або закрити допоміжні файли), то цю функцію теж доведеться перевизначити.

Класи документа використовують функції OnOpenDocument і OnSaveDocument для читання документа з диска і, відповідно, для запису документа на диск. Перевизначати ці функції має сенс тільки в тому випадку, якщо їх стандартна реалізація (що має на увазі виклик функції-члена Serialize) недостатня. Чудовим прикладом ситуації, коли перевизначення функцій OnOpenDocument і OnSaveDocument неминуче, є шифрування даних перед записом на диск (і відповідно дешифровка при читанні з диска).

Реалізація за умовчанням функцій OnOpenDocument і OnCloseDocument має на увазі виклик функції-члена DeleteContents, яка видаляє лише вміст документа, не видаляючи сам об'єкт документа. Застосування функції DeleteContents при відкритті нового документа ефективніше (як з погляду використання пам'яті, так і швидкості виконання додатку), ніж фактичне видалення з пам'яті об'єкту колишнього документа і створення нового.

Функція-член OnFileSendMail пересилає по електронній пошті об'єкт документа як додаток (attachment) до повідомлення. Спочатку здійснюється виклик функції OnSaveDocument, що дозволяє зберегти копію документа в тимчасовому файлі на диску (у каталозі, вказаному в змінного середовища оточення TEMP). Потім програмний код функції-члена прикладає тимчасовий файл до повідомлення MAPI (Messaging Application Programming Interface або Messaging API— інтерфейс прикладних програм електронної пошти). Далі, код функції використовує функцию-член OnUpdateFileSendMaiL, щоб виконати команду, що ідентифікується в меню додатків константою ID_FILE__SEND_MA.IL, або зовсім відмовитися від відправки, якщо підтримка MAPI програмі недоступна. Обидві функції (OnFileSendMail і OnUpdateFileSendMail) є перевизначуваними, що дозволяє реалізувати в додатках нестандартну поведінку при обміні повідомленнями.


 

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

5418. Системи когенерації енергії 904 KB
  Системи когенерації енергії Основні терміни і визначення Калорія - традиційна позасистемна одиниця вимірювання, що дорівнюєенергії, необхідній для нагрівання 1 г води на 1° С. 1 кал ...
5419. Державне управління та економіко-правовий механізм природокористування і охорона навколишнього природного середовища 177.5 KB
  Державне управління та економіко-правовий механізм природокористування і охорона навколишнього природного середовища План Поняття і зміст державного управління природокористуванням Принципи управління в галузі охорони навколишнього приро...
5420. Бюджетне планування в Україні 80.5 KB
  Бюджетне планування в Україні Мета: закріпити знання щодо бюджетного планування в Україні. План Зміст і структура бюджетного процесу. Бюджетний регламент. Робота, яка передує складанню проекту бюджету держави. Бюджетне планув...
5421. Наполеоновські війни та Україна 37 KB
  Наполеоновські війни та Україна Ставлення українців до війни 1812 року ініційованої Наполеонівською Францією було неоднозначне. У народі ширилися чутки про наміри французького царя ліквідувати кріпосне право, відновити козацькі п...
5422. Українські землі під владою російської та австрійської імперій (кінець XVIII - початокXXст.) 148.5 KB
  Українські землі під владою російської та австрійської імперій (кінець XVIII - початокXXст.). Криза феодальних відносин. Буржуазні реформи 60-х років XIX ст. Австро-Угорська імперія (самостійне вивчення). Російська імперія ...
5423. Громадянська війна в Україні 202.5 KB
  Громадянська війна в Україні Заслуги та прорахунки Центральної Ради Заслуги. Центральна Рада, своєрідний український парламент. Вона поновила в Україні державницьку свід...
5424. Исследование дисперсионных искажений импульсов в оптическом волокне 1.21 MB
  Целью работы является проведение компьютерного эксперимента по исследованию влияния составляющих дисперсии на временные параметры передаваемых оптических импульсов: - модовой дисперсии ступенчатых оптических волокон- модовой дисперси...
5425. Разработка единичного технологического процесса механической обработки детали ВТУЛКА 899.5 KB
  Разработать и оформить единичный технологический процесс механической обработки детали ВТУЛКА (чертеж № 9) с использованием токарно-револьверного станка модели 1Е340П. Годовая программа выпуска 1200 штук. Последовательность работ: ...
5426. Проектирование коробки передач 77 KB
  Введение Автомобиль - самое распространенное в современном мире механическое транспортное средство. Коробка передач – механизм, преобразующий крутящий момент, передающийся от двигателя через сцепление, по величине и направлению. Дает возмо...