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


 

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

30784. Основные технологические процессы при монтаже ригелей и плит перекрытия 13.13 KB
  Плиты поднимают четырехветвевыми стропами сразу выверяют и приваривают к ригелям. В безбалочных перекрытиях по капителям укладывают осевые плиты а по ним плитывкладыши.
30785. Виды защитных покрытий и требования к ним 14.84 KB
  Защитные покрытия предназначены для защиты зданий и их элементов от внешних агрессивных воздействий окружающей среды. Защитные покрытия в зависимости от поражающих факторов бывают : Гидроизоляционные Антикоррозийные Огнеупорные теплоизоляционные светонепроницаемые и др.войлок Противокоррозийные покрытия защищают от коррозии наносятся окраской распылением.
30786. Технология устройства гидроизоляции 15.47 KB
  Гидроизоляция: Окрасочная Литая Оклеечная Жёсткая Окрасочную изоляцию жидкими составами толщиной 02. Литую асфальтовую изоляцию в виде сплошного водонепроницаемого слоя асфальтовой массы толщиной 10. На нее наносят слой битумной мастики толщиной 1. Швы между полотнищами очередных слоев смещают по отношению друг к другу Жесткая гидроизоляция цементнопесчаная гидроизоляция толщиной до 25 мм состава 1:1; 1 : 2; 1 : 3 устраивают двумя способами торкретированием и оштукатуриванием.
30787. Виды теплоизоляционных покрытий. Технология 15.75 KB
  Теплоизоляция: Засыпная Мастичная Литая Обвалакивающая Сборноблочная Вакуумная Засыпная в стену приваривают шпильки 335 см на них крепят мелкую металлическую сетку с ячейками в которые засыпается диатомовая крошка перлитовый песок мин и стекловата. Мастичная на стену с помощью шпилек устанавливают мелкую армирующую сетку. Мастику наносят на сетку 1 слой набрызг затем разглаживание последний слой укладывают рейкой. При устройстве однослойной изоляции поверх войлока укладывают оцинкованную металлическую сетку и закрепляют ее...
30788. Назначение кровель. Кровельные материалы. Виды кровель и требования к ним 14.37 KB
  Кровельные материалы. Кровли: Мягкие рулонные материалы мембраны мастичные Жёсткие листовые материалы штучные. Скатные кровли более 15 уклон штучные листовые материалы черепица металлочерепица рулонные.
30789. Устройство рулонных кровель 15.32 KB
  К вертикальной поверхности пополнительный слой гидроизоляции. Ковер начинают наклеивать с пониженных мест воронок внутреннего водостока ендов карнизов послойно: сначала первый слой по всей площади захватки после его проверки и приемки второй слой до 5. Наклейка : послойная слой за слоем по всей площади крыши ступенчатая3 5 слоёв сразу. Наплавляемый рубероид нижний слой полимерное покрытие нагревают путём разогрева газовыми горелками.
30790. Устройство мастичной кровли 14.78 KB
  К вертикальной поверхности пополнительный слой гидроизоляции. Разливают слой битумнополимерной мастики. В неё втапливают арматурный слой стеклосетку 34слоя. Сверху защитный слой мелкого гравия.
30791. Мембранные кровли 16.44 KB
  Наносится с использованием клеевой технологии. ТПО смесь каучука и полимеров повышающих механическую прочность менее эластичны ПВХ мембраны Способы соединения полотнищ: сварка горячим воздухом клеевой способ 2хсторонние склеивающие ленты Способы закрепления мембранных кровель: Баластный способ свободное положение закрепляют по периметру в местах примыкания к вертикальным поверхностям. Наносят клеевой состав и раскатывают катком.
30792. Устройство металлических кровель 13.66 KB
  Основание для покрытия кровельной сталью выполняют в виде обрешетки из деревянных брусков 50 х 50 мм и досок от 50 х 120 до 50 х 110 мм. Конек устраивают из соединяемых под углом досок. Расстояние между осями досок принимают равным 1390 мм чтобы стыки листов попадали на них.