ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 2

Часть 1. Обучение ObjectWindows
Глава 1. Унаследование окон
Данная глава служит обзором программирования для Microsoft Windows с использованием Turbo Pascal, подчеркивая методы объектно-ориентированного программирования. Представленные в данном руководстве примеры используют ObjectWindows, которая поставляется с 
Turbo Pascal. Вы узнаете, что входит в приложение Windows и что выходит из него. Вы узнаете, какое поведение должно быть присуще приложению Windows, и объектно-ориентированное программирование с использованием ObjectWindows автоматизирует многие задачи и
 упрощает решение других задач.
Для получения максимальной пользы от материала данной главы нужно четкое понимание концепций объектно-ориентированного программирования. Если вы новичок в объектно-ориентированном программировании, то вам следует внимательно проработать "Руководство поль
зователя", Главу 4, "Объектно-ориентированное программирование".
Что представляет собой приложение Windows
На Рис.1.1 показаны основные компоненты приложения Windows. То, что за ними стоит, зависит от вашего знакомства с данными компонентами.
Рис.1.1. Экранные компоненты приложения Windows
1 - блок меню управления; 2 - меню; 3 - заголовок; 4 - блок уменьшения; 5 - блок увеличения; 6 - блок диалога; 7 - управление; 8 - область пользователя; 9 - прокрутка; 10 - окно
Приложение Windows является специальным типом программы для персонального компьютера, которая:
 - Должна иметь файл специального исполняемого типа формата.
- Работать только с Windows.
- В общем случае работать в прямоугольном окне на экране.
- Должна быть способна работать одновременно с другими приложениями Windows и не Windows, включая свои версии.
- Уметь осуществлять связь и обмен данными с другими приложениями  Windows.
Преимущества Windows
Windows обладает рядом преимуществ как для пользователя, так и дляразработчика. Преимущества для пользователя состоят в следующем:
- Стандартные и предсказуемые действия. Если вы знаете как  пользоваться одним приложением Windows, то вы знаете как их  использовать все.
- Нет необходимости устанавливать устройства и драйверы для каждого приложения. Windows содержит все драйверы, которые необходимы для работы периферийных устройств.
- Взаимодействие и связь между несколькими приложениями.
- Многозадачный режим: возможность одновременной работы нескольких            приложений.
- Доступ к дополнительной памяти. Windows обеспечивает защищенный  режим работы.
Преимущества для разработчика состоят в следующем:
- Независимая от аппаратуры графика, поэтому графические приложения  работают на всех стандартных типах адаптеров дисплея.
- Гарантированное обеспечение работы широкого диапазона принтеров,  мониторов и мышей.
- Развитая библиотека графических программ.
- Дополнительная память для больших программ.
- Обеспечение работы с меню, пиктограммами, побитовыми распределениями и другие возможности.
Требования
Оборотной стороной преимуществ, которые дает пользователю и разработчику использование Windows является повышение требований к характеристикам используемой аппаратуры. Для Windows обычно требуются более мощные графические средства, наличие дополнительной
 памяти и более быстрый процессор для того, чтобы получить характеристики, эквивалентные соответствующему приложению DOS. Если у вас есть компьютер 80286 или лучше и по крайней мере 2Мбайта памяти, то Windows будет работать хорошо.
Средства программирования
В Windows для разработчика приложения имеется большое число средств программирования.
Управляемая событиями архитектура
Windows основана на управляемой событиями архитектуре. Это значит, что любой осуществляемый пользователем ввод рассматривается как событие. Состоит ли это событие в нажатии кнопки на мыши или в нажатии клавиши на клавиатуре, для Windows это событие и Win
dows генерирует соответствующее сообщение. Например, если пользователь нажмет на мыши левую кнопку, Windows генерирует сообщение wm_LButtonDown. Если пользователь нажмет клавишу на клавиатуре, Windows генерирует сообщение wm_KeyDown. Windows рассматривае
т все команды управления и меню, задаваемые с помощью мыши или клавиатуры, как сообщения wm_Command. Дополнительную информацию о сообщениях можно найти Главе 7, "Обзор ObjectWindows". Эта управляемая событиями архитектура прекрасно согласуется с объектно
-ориентированным подходом Turbo Pascal.
Независимая от аппаратуры графика
Windows унифицирует процесс вывода информации на экран и принтер и сводит его к единому модулю, называемому интерфейсом графическогоустройства (GDI), который обеспечивает общий интерфейс для каждой программы Windows. Более того, Windows обладает драйвера
ми для большинства стандартных графических адаптеров и принтеров. Результирующая система позволяет написать одно приложение, которое работает без каких-либо изменений на большинстве имеющихся в мире аппаратных средств.
Аппаратно-независимая графика имеет ряд преимуществ, которые могут быть не столь очевидными. Во-первых, приложения Windows в общем случае устанавливаются значительно проще, т.к. нет необходимости изменения конфигурации системы из-за каких-то специфически
х драйверов устройств. Во-вторых, приложения Windows в локальных сетях часто работают лучше, т.к. каждый пользователь имеет собственную локальную конфигурацию.
Но за аппаратно-независимую графику приходится платить. Разработчику приходится строго выдерживать требования GDI. GDI ограничивает возможности программиста в разработке приложений.
Многозадачный режим
Windows разрешает пользователю одновременно запускать несколько приложений, устраняя необходимость программ, которые после прерывания их выполнения остаются резидентными (TSR). Windows не просто обеспечивает многозадачный режим работы, но и обеспечивает 
ряд возможностей межпроцессорного обмена, таких как буфер вырезанного изображения и динамический обмен данными (DDE).
Межпроцесорный обмен рассматривается в Главе 16, "Динамический обмен данными".
Windows организует работу нескольких приложений таким образом, что каждое приложение вместо полного экрана использует один или несколько прямоугольников, называемых окнами. Эти окна можно сдвинуть на экране, изменить их размер, спрятать в качестве пиктог
рамм, что дает пользователю возможность быстро осуществлять переход от одной задачи к другой. С точки зрения программиста, это означает, что программа не должна выводить текст или графику в конкретное место экрана. Вместо этого рисование происходит внутр
и некоторой области ограниченной рамкой, области пользователя. Аналогичным образом приложение должно уметь делить имеющуюся свободную память компьютера с другими приложениями. Хорошее приложение Windows корректно реализует правила Windows, касающиеся упр
авления экраном и памятью.
Управление памятью
В типичном сеансе работы с Windows множество приложений запускается на выполнение и заканчивает свою работу множество раз, т.о. что не происходит загрузка в память каждого приложения после предыдущего: для Windows в этом случае скоро не хватит памяти. Вм
есто этого Windows может переместить большую часть памяти приложения либо в другую часть памяти либо на диск, для обеспечения работы других приложений или самого Windows.
Приложение Windows, т.о. должно соответствовать правилам Windows по динамическому управлению памятью и не использовать непосредственного доступа к конкретным адресам памяти. Например, традиционный указатель на адрес памяти может довольно скоро стать неве
рным при переразмещении памяти Windows, т.к. в этом случае указатель будет указывать на место в памяти, которое вероятно уже используется для хранения чего-то другого.
Управление памятью Windows подробно описано в главе 14, "Управление памятью".
Вместо указатель приложения Windows используют регуляторы, которые представляют собой указатели на указатели. Регуляторы это числа, которые служат индексами в таблице указателей, управляемой Windows. Т.о. приложения Windows организуют ссылку на содержимо
е окна или дисплея (область рисования на экране) по его регулятору. Существуют регуляторы на элементы приложения, строки,инструменты рисования и ресурсы, такие как меню и пиктограммы.
При нормальном использовании вам не придется иметь дело с регуляторами непосредственно. Вы можете размещать и высвобождать динамическую область памяти, используя обычные программы New, Dispose, GetMem и FreeMem, а Turbo Pascal будет взаимодействовать с W
indows для определения объектов, на которые в действительности указывают указатели.
Одно из основных преимуществ менеджера памяти Windows состоит в возможности разделения скомпилированного кода между приложениями. Например, если пользователь запустит два экземпляра одного и того же приложения, то эти два приложения будут использовать од
ин скомпилированный код в памяти. Аналогично, приложение может динамически загрузить модуль библиотеки, который может быть разделен между различными приложениями. Этот прием известен в качестве библиотек динамической компоновки, или DLL.
Ресурсы
Ресурсы есть описания интерфейсов устройств приложения Windows  пользователя: его меню, блоки диалога, курсоры, пиктограммы, побитовые распределения, строки и клавиши акселераторов. В Windows имеется средство обработки этих описаний вне исходного кода пр
иложения. Ресурсы приложения объединяются с его скомпилированным исполняемым файлом до запуска приложения. Для уменьшения использования памяти приложение вызывает свои ресурсы в память только тогда, когда они необходимы.
Выделение спецификации ресурса из исходного кода дает дополнительное преимущество: внешний вид приложения может быть изменен без воздействия на исходный код программы. В действительности для модификации ресурсов приложения нет необходимости даже иметь ег
о исходный код. Это значительно упрощает процесс настройки и перевода существующих приложений Windows.
Turbo Pascal имеет полный набор редакторов для создания и адаптации ресурсов.
Динамическая компоновка
Windows допускает использование приложений, включая программы на Turbo Pascal, которые загружают и высвобождают библиотечные модули в процессе своего выполнения. Эти модули должны иметь специальный исполняемый формат (EXE) называемый библиотекой динамиче
ской компоновки (DLL). Часто эти библиотеки выполняют специфические и сложные задачи, такие, например, как преобразование формата файла. Если это нужно для дела, DLL можно использовать в качестве фильтров для импортирования и экспортирования файлов. Боле
е того, DLL могут совместно использоваться группой приложений, обеспечивая повторное использование и сохранение памяти.
В Turbo Pascal можно создавать библиотеки динамической компоновки.
Буфер вырезанного изображения
Буфер вырезанного изображения в Windows позволяет пользователю передавать информацию (текст, изображения и данные) между приложениями, между разными частями приложения или во временную память для последующего использования. Например, приложение по обрабо
тке текстов будет использовать буфер вырезанного изображения для операций вырезки, копирования и вставки.
Динамический обмен данными
Динамический обмен данными (DDE) является другим протоколом динамического обмена. Если буфер вырезанного изображения находится под полным управлением пользователем, то DDE работает под управлением программы и внешне никак не проявляется. Одно приложение 
передает информацию другому путем посылки соответствующих сообщений DDE.
Множественный интерфейс документа
Множественный интерфейс документа (MDI) это набор соглашений пользователей относительно создания окон, которые содержат внутри себя дочерние окна. Примером MDI является интегрированная среда разработки (IDE) Turbo Pascal. При работе с Turbo Pascal пользо
ватель может открыть одновременно несколько окон редактирования.
Рис.1.2. IDE Turbo Pascal в качестве примера MDI
Типы данных в Windows
Схема работы с данными в Windows и ее связь с языком программирования С привела к развитию некоторых специализированных типов данных при программировании для Windows на Turbo Pascal. Например, регулятор окна хранится в типе HWnd. Turbo Pascal и ObjectWin
dows определяют новые типы, включающие в себя типы, подобные HWnd. Документация по всем этим новым типам и структурам данных находится в "Справочном руководстве по Windows".
Объектно-ориентированное использование окон
Как вы уже могли видеть, программирование в среде Windows требует очень аккуратного использования событий, форматов, регуляторов и других приложений, поэтому разработка программы для Windows может оказаться достаточно сложной задачей. К счастью, объектно
-ориентированное программирование существенно облегчает задачу программирования для среды Windows, позволяя разработчику приложения сосредоточиться на функциях приложения, а не на его форме. Используя объекты для представления сложных структур, подобных 
окнам, программа на Turbo Pascal может объединять свои операции и хранение данных. Это большое достижение ObjectWindows. 
Объектно-ориентированное программирование (OOP) создает среду, в которой программист использует объекты для представления достаточно сложных элементов интерфейса пользователя программы Windows. Это очевидно означает, что окно является объектом. Объектно-
ориентированное окно и типы объектов приложения управляют обработкой сообщений, которое требуется от программы Windows, что в значительной степени упрощает взаимодействие программиста и пользователя. В действительности, объекты ObjectWindows представляют
 из себя не только окна, но блоки диалога и управления (блоки списков и клавиши).
Лучший интерфейс для Windows
ObjectWindows использует объектно-ориентированное расширение Turbo Pascal для работы с программным интерфейсом приложения Windows (API), скрывая от вас детали программирования Windows. В результате этого вы можете использовать Turbo Pascal для написания 
программ Windows в значительно более короткие сроки и с меньшими усилиями, чем если бы использовался не объектно-ориентированный подход. В ObjectWindows можно особенно выделить три полезные особенности: включение информации об окне, абстрагирование от от
 функций API Windows, автоматическая реакция на сообщения.
Объекты интерфейса
Поскольку Object Windows определяет объекты для окон, блоки диалога и управления, она предоставляет по объектам только их поведение, атрибуты и хранение данных. Физическая реализация и визуальное появление элементов на экране управляется самим Windows. О
бъекты ObjectWindows, которые мы будем называть объектами интерфейса, формируют взаимодействие с соответствующими визуальными элементами, которые мы будем называть элементами интерфейса. Успешное взаимодействие между объектами и элементами является ключе
вым моментом в успешном программировании для Windows с ObjectWindows.
Связь объекта и элемента называется регулятором окна. При конструировании объекта интерфейса он дает инструкцию Windows на создание элемента интерфейса. Windows возвращает регулятор, идентифицирующий этот элемент, который объект хранит в поле с именем HW
indows. Многие из функций Windows требуют требуют в качестве своего параметра регулятор окна, поэтому хранение его в соответствующем поле делает его доступным для объектов окна. Аналогично, поля интерфейса объекта могут использоваться для хранения инстру
ментов рисования или информацию о статусе для конкретного окна.
Абстрагирование функций Windows
Приложения Windows воздействуют на свое появление и поведение путем вызова соответствующих функций Windows, которые представляют собой набор из почти 600 функций, составляющих программный интерфейс приложения Windows (API). Каждая из функций требует множ
ества разных параметров многих различных типов, что уже само по себе может вызвать головную боль. Хотя и можно вызвать любую из функций Windows непосредственно из Turbo Pascal, ObjectWindows упрощает задачу, предлагая объектные методы, которые абстрагиру
ют вызовы функций. Как уже было отмечено ранее, многие из параметров для функций Windows уже хранятся в полях объекта интерфейса. Т.о. этот метод может использовать эти данные для передачи параметров в функции Windows. Кроме того, ObjectWindows может сгр
уппировать связанные вызовы функций в общую процедуру, которая выполняет задачу верхнего уровня. Результатом является более быстрое и легкое использование API для усовершенствования существующего API Windows.
Предлагаемый метод существенно уменьшает вашу зависимость от сотен функций API Windows, но он не мешает вам вызывать API непосредственно. ObjectWindows является наилучшим решением: объектно-ориентированная разработка на высоком уровне плюс максимальное у
правление графической средой.
Автоматизация реакции системы в виде сообщений
Кроме инструкций для среды Windows о необходимости проведения определенных действий, большинство приложений должно иметь возможность реагировать на сотни сообщений Windows, которые являются результатом действий пользователя (например, нажатие кнопки на м
ыши), других приложений и от прочих источников. Обработка сообщений и корректная реакция на них служит определяющим фактором надлежащего функционирования вашей программы. В конце концов, не так уж и трудно сделать так, чтобы ваша программа реагировала не
которым на осуществление выбора варианта из меню и реагировала на некоторое конкретное сообщение. Но написание приложения, которое реагировало бы на примерно 200 разных сообщений Windows так же сложно, как и организация вызова требуемой функции Windows.
Объекты с их заранее определенным поведением (методы) прекрасно согласуются с решением задачи реагирования на внешние стимулы (сообщения Windows). ObjectWindows воспринимает сообщения Windows и переводит их в вызовы метода Turbo Pascal. Т.о. используя Ob
jectWindows вы просто определяете метод реакции на каждое сообщение, которое нужно обработать вашему приложению. Например, когда пользователь нажимает на мыши левую кнопку, Windows генерирует сообщение wm_LButtonDown. Если вам требуется, чтобы окно или у
правление вашей программы реагировали на такое действие, вы просто определяете метод WMLButtonDown, связанный с сообщением wm_LButtonDown. Т.о. каждый раз, когда Windows посылает это сообщение, ваш объект будет автоматически вызывать определенный вами ме
тод.
Подобные методы называются методами реакции на сообщения. Без  объектно-ориентированного программирования и ObjectWindows вам пришлось бы писать длинный оператор case для каждого окна и управления, распознающий, что пришло сообщение, определяющий тип пос
тупившего сообщения и затем решающий, что с ним делать. Обо всем этом позаботится ObjectWindows.
Структура программы Windows
Имея в наличии такое большое количество элементов программного  обеспечения как DOS, Windows и приложения. взаимодействующие друг с другом, было бы полезно знать, как части вашего приложения Windows взаимодействуют с окружающей средой. В данном разделе п
оказана структура Windows и типичного приложения Windows, написанного на Turbo Pascal с ObjectWindows.
Структура Windows
Во время работы приложения функционирование Windows и API основывается на вызовах трех модулей внешних библиотек. Эти модули Windows следующие:
- KERNEL.EXE - Отвечает за управление памятью и ресурсами,                планирование и взаимодействие с DOS.
- GDI.EXE - Отвечает на вывод графики на экран и принтер.
- USER.EXE - Отвечает за управление окном, ввод пользователя и              связь.
Эти модули являются частью рабочей версии Windows, поэтому они должны быть уже загружены на компьютер пользователя, если у него конечно имеется пакет Windows. Вы пишете программу, которая использует эти модули библиотек, но не включает их. 
Взаимодействие с Windows и DOS
Операционная система DOS имеет ограниченную сферу действия, поэтому очень легко увидеть вклад DOS в успешное функционирование вашей прикладной программы DOS. Вне всякого сомнения программа DOS работает только благодаря взаимодействию вашего прикладного к
ода со средствами операционной системы. То же самое относится и к программам Windows. Windows предлагает настолько больше функциональных возможностей для операционной системы, что значительно труднее отследить взаимодействие между Windows и приложением. 
Например, для рисования графики на экране ваша программа должна вызвать функцию Windows GDI. Для реагирования на нажатие пользователем кнопки на мыши ваша программа должна определить метод реакции на сообщения. Ваша программа должна постоянно взаимодейст
вовать с операционной системой (DOS плюс Windows).
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і                   Приложение Windows                          і
і                                     і                         і
і              ЪДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
і              і                      і                         і
і              і    Модули Windows: GDI, USER и KERNEL          і
і              і                                                і
і      і       і                                                і
іДДДДДДЕДДДДДДДБДДДДДДДДДДДДДДДї                                і
і      і  DOS                  і                                і
і і                            і                і               і
ГДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і і                            і                і               і
і    Драйверы устройств DOS    і   Драйверы устройств Windows   і
і                           і  і                і               і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДБДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і                           і                   і               і
і                   Компьютер и периферийное оборудование       і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис.1.3. Взаимодействие приложения Windows с Windows и DOS. Пользователь разрабатывает нижнюю часть диаграммы
"Здравствуй, Windows"
Традиционный способ знакомства с новым языком программирования или средой состоит в том, чтобы рассмотреть программу "Здравствуй, Мир", написанную на этом языке или для этой среды. Эта программа обычно состоит из минимального кода, достаточного лишь для 
того, чтобы вывести на экран строку "Здравствуй, Мир".
Конечно же, Windows может сделать значительно больше. Необходимо создать окно, написать в него и научить окно взаимодействовать с окружающим его миром: т.е. по крайней мере иметь возможность закрыть его и удалить. Если попытаться сделать эту программу с 
нуля, то придется проделать достаточно большой объем программирования лишь для выполнения этой основной операции. Например, включенная на дистрибутивные диски программа GENERIC.PAS, выполняет эту минимальную задачу и содержит более 100 строк !
Это происходит из-за того, что Windows предъявляет целый список требований, которым должно удовлетворять приложение, чтобы оно могло работать в Windows. Даже наипростейшая программа требует наличия некоторого количества кода. К счастью, написанные с Obje
ctWindows программы удовлетворяют большинству из этих требований, включая создание и отображение головного окна и хранение регулятора приложения. Т.о. наша программа "Здравствуй, Мир", может быть упрощена до 16 строк:
program HelloApp;
uses WObjects;
type
 THelloWorld=object(TApplocation)
  procedure InitMainWindow; virtual;
 end;
procedure THelloWorld.InitMainWindow;
begin
 MainWindow:=New(PWindow, Init(nil, 'Hello, Turbo Pascal world'));
end;
var HelloWorld:THelloWorld;
begin
 HelloWorld.Init('HelloWorld');
 HelloWorld.Run;
 HelloWorld.Done;
end.
Предназначение запуска приложения
Первое действие программы ObjectWindows после ее запуска состоит в том, чтобы взять от Windows четыре значения и записать их в глобальные переменные. Это происходит автоматически, но это приходится реализовывать самому, если программа не использует Objec
tWindows. Эти глобальные переменные следующие:
- HInstance - хранит регулятор к экземпляру приложения.
- HPrevInst - хранит регулятор к последнему экземпляру этого же              приложения. Если это первый экземпляр, то - ноль.
- CmdShow - хранит начальный режим дисплея головного окна в виде             целой величины. Используется для вызова метода Show.
- CmdLine - хранит строку, представляющую собой командную строку             запуска приложения, включая опции и имя файла. Например, 'CALC.EXE/M' или 'WORDPROC.EXE LETTER1.DOC'.
В качестве приложения ObjectWindows, HelloApp должна сконструировать и инициализировать головное меню объекта. Она может инициализировать только первый экземпляр HelloApp с помощью метода InitApplication или инициализировать все экземпляры HelloApp с пом
ощью метода InitInstance.
HelloApp начинает цикл сообщения вызовом Run. В конце она прекращает свою работу удаляя объект приложения с помощью метода Done.
Предназначения головного окна
Головное окно приложения это окно, которое первым появляется на экране после запуска приложения. Оно показывает пользователю список имеющихся команд (меню). Во время сеанса работы приложения головное окно управляет интерфейсом приложения и во многих случ
аях является единственным рабочим окном программы, открывая по мере необходимости блоки диалога. Однако, более сложные приложения могут иметь несколько окон, которые служат рабочими областями. И, наконец, когда пользователь закрывает головное окно, оно о
твечает за инициализацию процесса закрытия приложения.
Цикл разработки приложения
Поскольку на каждое приложение Windows налагаются определенные требования (например, инициализация головного окна), то целесообразно начать разработку вашего нового приложения путем модификации уже существующего. В ObjectWindows имеется множество примеро
в программ. Нужно лишь выбрать из них то, которое максимально подходит к вашему новому приложению. 
Используя интегрированную среду разработки Windows вы можете существенно сократить цикл разработки. Благодаря возможности многозадачного режима работы Windows можно одновременно запустить на выполнение IDE, редакторы ресурсов, отладчик и ваше приложение.
 Задачу существенно упрощает не только набор инструментальных средств, поставляемых с Turbo Pascal для Windows, но и число задач, которые можно одновременно использовать при разработке приложения Windows. В процессе создания приложения можно выделить 
следующие этапы:
1. Создать программный код.
2. Создать ресурсы для диалога, меню и т.д.
3. Скомпилировать программу (ресурсы могут быть скомпонованы в нее    автоматически).
4. Отладить программу в диалоге.
Turbo Pascal для Windows предоставляет самую легкую среду для разработки приложений Windows.


Яндекс цитирования