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) є перевизначуваними, що дозволяє реалізувати в додатках нестандартну поведінку при обміні повідомленнями.


 

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

30712. Парижская мирная конференция и ее решения. Версальский мирный договор 24 KB
  Возглавлял конференцию Климансо присутствовали лидеры ведущих стран ЛлойдДжордж Великобритания Вильсон США и др. Но главные решения принимались в узком кругу сначала пяти государств Франция Великобритания США Италия Япония а затем только трех Франции Великобритании США таким образом сохранялась практика тайной дипломатии т. Американский конгресс не утвердил вступление США в эту организацию. Франция и Италия за военное давление на Сов России; Великобритания и США более осторожны за переговоры.
30713. США динамика развития в двухполюсном мире 31 KB
  Вторая мировая война стимулировала быстрое экономическое развитие США. Изменилась отраслевая структура экономики США успешнее решались проблемы занятости населения. В первые послевоенные годы в США была успешно проведена конверсия военного производства. С конца 40х годов устойчивый и непрерывный экономический рост стал отличительной особенностью функционирования экономической системы США.
30714. Противоречия Версальско-Вашингтонской системы международных отношений 26.5 KB
  Франция требовала вернуть им Эльзас и Лотарингию установить контроль за промышленным Рурским районом претендовали на германские колонии в Африке и Средиземноморье и т. Великобритания хотели сохранить единство Германии установив контроль над её экономикой.
30715. Факторы социальной и политической нестабильности во Франции в 1950-е годы. Конец 4-ой республики (1958 г.) 25.5 KB
  во Франции обострилась проблема инфляции. В этот период во Франции усилились попытки коммунистов дискредитировать американскую помощь или отказаться от нее а партия де Голля Объединение французского народа РПФ желая уберечь страну от коммунизма стремилась к власти и изменению государственного строя.
30716. Развитие социально-политического кризиса в Европе в начале 1920-х гг 22 KB
  : сильный рост промышленного правительства в США Франции в результате 1 мировой войны они обогатились. Основой промышленного подъема был технический прогресс новые технологии новые отрасли автомобили Увеличение концентрации и централизации капитала усиления мощи корпораций смена промышленности и банков рост финансового капитала. Рост благотворительности для поддержания социальной стабильности.
30717. ФРГ: переход к новой «восточной политике». Договор с СССР от 12 августа 1970 г 27 KB
  Брандт с 1969 канцлер ФРГ лидер социалдемократов. Подтверждалось что Западный Берлин не является частью территории ФРГ и устанавливался тройной механизм взаимоотношений между компетентными органами ГДР Западного Берлина и ФРГ по вопросам регулирования транзитных перемещений граждан транспортного телефонного и телеграфного сообщения и пр. Но Западный Берлин имел международные соглашения заключенные ФРГ поэтому ФРГ получила право представлять интересы жителей Западного Берлина в международных организациях по вопросам не...
30718. Причины, особенности и основные последствия мирового экономического кризиса 1929 – 1933 гг 23 KB
  Мировой экономический кризис 19291933 годов носивший название Великой депрессии наиболее сильно затронул такие страны как Великобритания США Франция Канада и Германия. Важным фактором обусловившим всемирный характер великой депрессии стал процесс перемещения экономического центра из Западной Европы в США. Последствиями Великой депрессии стали: ухудшение уровня жизни фермеров и мелких торговцев; уменьшение уровня производства; рост числа безработных; возрастание сторонников фашистских организаций.
30719. Исторический опыт Народных фронтов (Франция, Испания, Чили) 23.5 KB
  Народный фронт представляет собой политический союз который как правило объединяет левые и центральные силы для осуществления противодействия правым силам представителей власти. Основной целью возникновения народных фронтов стала борьба за защиту экономических интересов рабочего класса и противопоставление войне и фашизму. Самый первый народный фронт был образован во Франции в 1935 году который объединил в себе все левосторонние партии.
30720. Общее и особенное в политике британских консерваторов и лейбористов в 1920-е гг 23 KB
  Консервативная партия Великобритании одна из двух ведущих политических партий страны образовавшаяся в 1867 году на базе партии тори. К 1930му году в Великобритании стала ясной гибель радикального социализма тогда на первый план выдвинулся либерализм который настаивал на прямом вмешательстве государства в экономику и передаче государству целого ряда социальных функций. Внутреннюю политику консерваторов Великобритании 1920 1930х годов можно охарактеризовать как стремление сохранить существующую ранее универсальность и...