Часть 2. Использование ObjectWindows
Глава 7. Иерархия ObjectWindows
-----------------------------------------------------------------
ObjectWindows представляет собой исчерпывающий набор объек-
тов, облегчающий разработку программ для Microsoft Windows на
Паскале. В данной главе вы найдете обзор иерархии объектов
ObjectWindows. В остальных главах данной части дается детальное
описание различных частей иерархии.
Кроме описания иерархии объектов, в данной главе описываются
основные принципы программирования для операционной среды
Windows, включая вызов API Windows.
Соглашения Windows
-----------------------------------------------------------------
Соглашения по именам ObjectWindows обеспечивают ясность и
содержательность имен.
Имена объектов
-----------------------------------------------------------------
Имена всех объектный типов, предусмотренных в ObjectWindows,
начинаются с буквы T. Например, объекты диалоговых окон имеют тип
TDialog. Для каждого определения объектного типа имеется соот-
ветствующий ссылочный тип, начинающийся с P. Например, указатель
на TDialogh имеет тип PDialog. В примерах данного руководства бу-
дут создаваться динамические экземпляры объектов, например, с по-
мощью PDialog позволяет разместить объекты TDialog в динамически
распределяемой области памяти.
Имена методов
-----------------------------------------------------------------
Методы реакции на сообщения называются по именам сообщений,
на которые они отвечают, но без подчеркиваний. Например, метод,
отвечающий на сообщение wm_KeyDown будет называться WMKeyDown.
Обзор объектов
-----------------------------------------------------------------
Иерархия объектов
-----------------------------------------------------------------
ObjectWindows - это иерархия объектных типов, которые вы мо-
жете использовать для работы с большинством обычных задач в при-
ложении ObjectWindows. Схема объектов пользовательского интерфей-
са библиотеки показана на Рис. 7.1. На Рис. 7.2 представлены объ-
екты иерархии, используемые для управления данными и проверки их
допустимости.
+----------------+
| TObject |
+-------+--------+
+----+--------------+----------------------+------------+
+-------+--------+ +--------+-------+ +-------+--------+ |
| TPrintout | | TPrinter | | TWindowsObject | |
+-------+--------+ +----------------+ +-------+--------+ |
+-------------------+ | |
+-------+--------+ +--------+-------+ +-----------+ |
| TEditPrintout | | TWindowPrintout| | +------------|
+----------------+ +----------------+ | | |
| +-------+--------+ |
+--------------------+----------+ | TApplication | |
| | +----------------+ |
+------+---------+ +--------+-------+ +------------+
| TDialog | | TWindow | |
+------+---------+ +--------+-------+ +-------+--------+
| | | TScroller |
| | +----------------+
| +----------------------------+
+-------------------+-----------+ |
+------+---------+ +-------+--------+ | |
| TFileDialog | | TInputDialog | | |
+----------------+ +----------------+ | |
+----------------------+--------+ |
+------+------------+ | |
|TPrinterAbortDialog| +------------+ |
+-------------------+ | | |
| +--------+-------+ |
+---------------------| | TPrintDialog | |
+-------+--------+ | +----------------+ |
|TPrinterSetupDlg| +------------+ |
+----------------+ | |
+--------+-------+ |
| TDlgWindow | |
+----------------+ |
|
+------------------+------------------+----------|
+-------+--------+ +-------+--------+ +-------+--------+ |
| TControl | | TMDIClient | | TMDIWindow | |
+-------+--------+ +----------------+ +----------------+ |
+------------------+-----------+ +------+
+-------+--------+ +-------+--------+ | +-------+--------+
| TButton | | TScrollBar | | | TEditWindow |
+-------+--------+ +----------------+ | +-------+--------+
+-------+--------+ | +-------+--------+
| TCheckBox | +-----------| | TFileWindow |
+-------+--------+ | | +----------------+
+-------+--------+ +-------+--------+ +----------+
| TRadioButton | | TStatic | | |
+----------------+ +-------+--------+ | |
| | +-------+--------+
+-------+--------+ | | TListBox |
| TEdit | | +-------+--------+
+----------------+ | |
| +-------+--------+
+-----------+ | TComboBox |
| +----------------+
+-------+--------+
| TGroupBox |
+----------------+
Модуль OPRINTER: Модуль OWINDOWS: Модуль OSTDDLGS:
TPrinout TWindow TInputDialog
TPtinter TAppication TInputDialog
TEditPrintout TScroller
TWindowPrintout
TPrinterAbortDlg
TPrintDialog
TPrinterSetup
Модуль ODUIALOGS: Модуль OSTDWNDS:
TDialog TEditWindow
TDlgWindow TFileWindow
TButton
TScrollBar
TCheckBox
TRadioButton
TControl
TStatic
TEdit
TListBox
TComboBox
TGroupBox
Рис. 7.1. Иерархия объектных типов ObjectWindows.
+----------------+
| TObject |
+-------+--------+
+----+--------------+--------------------+
+-------+--------+ +-------+--------+ +-------+--------+
| TValidator | | TCollection | | TStream |
+-------+--------+ +----------------+ +---------+------+
+---------------------+------------------+ +--------+
+-------+-----------+ +-------+--------+ +-------+--------+ |
|TPXPictureValidator| |TFilterValidator| |TLookupValidator| |
+-------------------+ +-------+--------+ +-------+--------+ |
+-------+---------+ | |
| TRangeValidator | +--+ |
+-----------------+ | |
+----------+-----------+ |
|TStringLookupValidator| |
+----------------------+ |
+-------------------+-------------------+-----------+
+-------+--------+ +-------+--------+ +-------+--------+
| TMemoryStream | | TDosStream | | TEmsStream |
+----------------+ +-------+--------+ +----------------+
+-------+--------+
| TBufStream |
+----------------+
Рис. 7.2 Иерархия наборов, потоков и проверки допустимости.
Модуль OBJECTS: Модуль VALIDATE:
TObject TValidator
TCollection TPXPictureValidator
TSortedCollection TFilterValidator
TStrCollection TRangeValidator
TStringCollection TLookupValidator
TStream TStrongLookupValidator
TMemoryStream
TEmsStream
TDosStream
TBufStream
Базовый объект
TObject - это базовый объектный тип, общий предок всех объ-
ектов ObjectWindows. Он определяет рудиментарный конструктор и
деструктор. Потоки ObjectWindows требует, чтобы записанные объек-
ты были потомками TObject.
TApplication
Этот тип определяет поведение, необходимое для всех приложе-
ний ObjectWindows. Каждое приложение ObjectWindows, которое вы
пишете, будет определять объектный тип приложения, производный от
TApplication. Объекты приложения подробно описываются в Главе 8
"Объекты приложения".
Интерфейсные объекты
Остальные объекты в иерархии ObjectWindows классифицируются
в общем случае как интерфейсные объекты. Они являются интерфейс-
ными в том смысле, что представляют элементы и пользовательском
интерфейсе Windows и служат интерфейсом между кодом вашей прик-
ладной программы и операционной средой Windows. Интерфейсные объ-
екты описываются в Главе 9.
Объекты Windows
Объекты Windows представляются не только знакомыми окнами
среды Windows, но и большинством визуальных инструментов операци-
онной среды, такими как управляющие элементы.
Объекты диалоговых блоков
Объекты диалоговых блоков (окон) обеспечивают временные ок-
на для обслуживания специальных функций ввода и вывода. В общем
случае они включат в себя текст и управляющие элемента, такие как
командные кнопки, блоки списка и полосы прокрутки. Об объектах
диалоговых блоков подробно рассказывается в Главе 11.
Объекты управляющих элементов
В диалоговых блоках и некоторых окнах управляющие элементы
позволяют пользователям вводить данные и выбирать параметры. Объ-
екты управляющих элементов обеспечивают согласованные и простые
средства для работы со всеми типами управляющих элементов, опре-
деленных в Windows. Объекты управляющих элементов подробно описы-
ваются в Главе 12.
Объекты MDI
Windows реализует стандарт для работы с несколькими докумен-
тами в рамках одного окна, которое называется множественным доку-
ментальным интерфейсом (MDI). ObjectWindows обеспечивает средства
для установки окон MDI и работы с ними. Объекты MDI подробно опи-
сываются в Главе 14.
Объекты проверки допустимости
ObjectWindows содержит полный набор объектов проверки допус-
тимости данных, которые позволяют проверять допустимость данных,
введенных пользователем, при выходе пользователя из поля или ког-
да пользователь завершает работу с окном. Проверка допустимости
данных описывается в Главе 13.
Объекты принтера
Для работы с печатью документов или печати содержимого окна
ObjectWindows предусматривает соответствующие объекты. О том, как
использовать эти объекты, рассказывается в Главе 15.
Объекты наборов и потоков
Модуль Object включает в себя многочисленные объекты, реали-
зующие гибкие структуры данных и потоки, позволяющие считывать и
записывать объекты. Наборы описываются в Главе 19, а потоки - в
Главе 20.
Файлы ObjectWindows
-----------------------------------------------------------------
Перечисленные выше типы ObjectWindows реализует в скомпили-
рованных модулях. В данном разделе кратко описывается содержимое
поставляемых модулей. В каждом приложении ObjectWindows требуется
только модуль OWindows.
В данной версии ObjectWindows различные части иерархии объ-
ектов разбивают различные части иерархии объектов по отдельным
моделям. Чтобы перекомпилировать код ObjectWindows более ранних
версий, в общем случае нужно изменить все ссылки на модуль
WObjects на OWindows и добавить к программам и модулям, использу-
ющим наборы и потоки или диалоговые блоки, соответственно Objects
и ODialogs.
В данную версию ObjectWindows добавлены также новые модули
для печати, проверки данных, специализированных управляющих эле-
ментов Borland и поддержки Windows 3.1.
В Таблице 7.1 перечислены модули, составляющие интерфейс
ObjectWindows и AOPI Windows 3.0. Модули, поддерживающие расшире-
ния Windows 3.1, представлены в Таблице 7.2.
Модули для ObjectWindows и API Windows Таблицы 7.1
+----------------+----------------------------------------------+
| Модуль | Содержимое |
+----------------+----------------------------------------------|
| Objects | Базовый объект TObject, наборы, потоки. |
| OWindows | Приложения, окна, полосы прокрутки, окна MDI.|
| ODialogs | Диалоговые блоки, диалоговые окна, управляю-|
| | щие элементы. |
| OPrinter | Печать, специальные распечатки. |
| Validate | Проверка допустимости данных. |
| BWCC | Специализированные управляющие элементы фирмы|
| | Borland. |
| OStdDlgs | Диалоговые блоки имен файлов, однострочный|
| | ввод. |
| OStdWnds | Окна текстового редактора, окна редактора|
| | файлов. |
| WinTypes | Все типы, используемые подпрограммами API|
| | Windows 3.0, включая записи, стили, сообщений|
| | и флаги. |
| WinProcs | Описания процедур и функций для API Windows|
| | 3.0. |
+----------------+----------------------------------------------+
Файлы ресурсов
-----------------------------------------------------------------
Модули OStdDlgs, OStdWnds и OPrinter имеют связанные с ними
файлы ресурсов. Ресурс модуля находится в файле с именем, эквива-
лентным имени модуля, и расширением .RES. Ресурсы автоматически
включаются при использовании соответствующих модулей, так что
программа, которая использует модуль OstdDlgs, будет автоматичес-
ки иметь доступ к ресурсам в OSTDDLGS.RES.
Файлы Windows 3.1
-----------------------------------------------------------------
Кроме стандартных модулей API Windows 3.0, вы можете писать
программы, использующие преимущества средств, добавленных в вер-
сию 3.1 Windows. Каждая из 11 DLL Windows 3.1 имеет соответствую-
щий модуль:
Модули для доступа к средствам Windows 3.1 Таблица 7.2
+----------------+----------------------------------------------+
| Модуль | Средство |
+----------------+----------------------------------------------|
| ComDlg | Общие диалоговые блоки. |
| DDTML | Сообщения динамического обмена данными. |
| Dlgs | Константы диалогового блока. |
| LZExpand | Расширения файла LZ. |
| MMSystem | Расширения мультимедиа. |
| OLE | Компоновка и встраивание объектов (OLE). |
| ShellAPI | Оболочка API Windows. |
| Stress | Строгая проверка типов. |
| ToolHelp | Отладка и другие инструментальные средства. |
| Ver | Версии. |
| Win31 | Расширения Windows 3.1. |
+----------------+----------------------------------------------+
Взаимодействие с Windows
-----------------------------------------------------------------
ObjectWindows избавляет вас от многих утомительных и запу-
танных частей Windows, но иногда возникает необходимость в непос-
редственном взаимодействии с Windows (например, когда вы хотите
переопределить некоторое заданное в Windows поведение или выйти
за рамки того, что инкапсулировано в ObjectWindows).
Существует два способа, с помощью которых вы можете взаимо-
действовать с ObjectWindows: вызов ее функций API и получение со-
общений. В данном разделе описываются функции API. Об обработке
сообщений рассказывается в Главе 16 "Сообщения Windows".
Функции API Windows
-----------------------------------------------------------------
Функциональные возможности Windows заключены в ее около 600
функций. Каждая функция имеет имя. Взаимодействовать с операцион-
ной средой Windows, модифицировать ее отображение или действие в
ответ на ввод пользователя можно с помощью вызова функций API.
Однако с помощью ObjectWindows вы можете создавать окна, выводить
диалоговые блоки и манипулировать управляющими элементами, не вы-
зывая функций Windows. Как все это работает?
Вызов в ObjectWindows функций API
-----------------------------------------------------------------
Методы ObjectWindows вызывают функции API. Но ObjectWindows
- это не дублируемые функциональные возможности; она предоставля-
ет в новом пакете объектно-ориентированной библиотеки функции
Windows, ее прикладной программный интерфейс (API). Кроме того,
ObjectWindows значительно упрощает задачи спецификации многочис-
ленных параметров, требуемых в функциях Windows. Часто ObjectWin-
dows автоматически подставляет параметры, такие как описатели
окон и идентификаторы дочерних окон, которые хранятся в интер-
фейсных объектах в виде полей.
Например, многие функции Windows для задания окна, с которым
они должны работать, используют описатели окна, и эти функции вы-
зываются обычно из методов оконного объекта. Объекты содержат в
поле HWindow описатель соответствующего окна и может передавать
его, освобождая вас от необходимости каждый раз задавать описа-
тель. Таким образом, объектные типы ObjectWindows служат объект-
но-ориентированным слоем, реализованным с помощью вызовов необъ-
ектно-ориентированных функций API.
Доступ к функциям API
-----------------------------------------------------------------
Чтобы из приложения ObjectWindows обратиться непосредствен-
но к функциям API, вы должны использовать модуль WinProcs.
WinProcs определяет для каждой функции Windows заголовок процеду-
ры или функции Паскаля, что позволяет вам вызывать функции
Windows как любую подпрограмму на Паскале. Перечень заголовков
этих функций вы можете найти в файле WINPROCS.PAS или в оператив-
ном справочнике Help.
Константы Windows
-----------------------------------------------------------------
Функции Windows требуют от вас передачи в качестве аргумен-
тов разнообразных констант типа Word или Longint. Эти константы
представляют стили окна, диалогового блока или управляющего эле-
мента, а также возвращаемые значение и др. Если в программе ис-
пользуются данные константы, она становится более читаемой, обс-
луживаемой и будет более независимой от изменений в последующих
версиях Windows, чем программы, использующие числа. Определенные
в модуле WinTypes константы описываются в Главе 21 "Справочник по
ObjectWindows".
Записи данных Windows
-----------------------------------------------------------------
Некоторые функции Windows требуют более сложных структур
данных, например, шрифтов (TLongFont) или классов окон
(TWndClass). Windows и ObjectWindows определяют эти и другие
структуры данных. Перечень доступных структур вы можете найти в
оперативном справочнике или в файле WINTYPES.PAS. Структуры, не-
посредственно используемые в ObjectWindows, вы можете найти в
Главе 21 "Справочник по ObjectWindows".
При использовании ObjectWindows все функции Windows доступны
также непосредственно и могут вызываться в вашей программе (если
в ее операторе uses указывается модуль WinProcs). Например, сле-
дующий код для получения окна сообщений вызывает функцию Windows
MessageBox:
Reply := MessageBox(HWindow, 'Хотите сохранить?',
'Файл изменен', mb_YesNo or mb_IconQuestion);
MessageBox возвращает целочисленное значение, указывающее,
какое действие выбрал пользователь для закрытия окна сообщения.
Если пользователь щелкнул "мышью" на командной кнопке Yes (Да),
то результат равен определенной в Windows целочисленной константе
id_Yes. Если пользователь щелкнул "мышью" на командной кнопке No
(Нет), то результат равен id_No.
Комбинирование констант стилей
-----------------------------------------------------------------
Функции Windows, позволяющие получить интерфейсные элементы,
требуют обычно некоторого параметра типа Word или Longint. Иден-
тификаторы констант стилей состоят из двухбуквенного мнемоничес-
кого префикса, за которым следует подчеркивание и описательное
имя. Например, ws_Popup - это константа стиля окна (ws_ означает
стиль окна - window style").
Примечание: В Windows определены сотни констант сти-
лей, которые перечислены в Главе 21 "Справочник по
ObjectWindows".
Часто эти стили комбинируются для получения другого сти-
ля. Например, в случае функции MessageBox вы можете передать в
качестве параметра стиля mb_YesNo или mb_IconQuestion. Этот стиль
дает окно сообщений с двумя командными кнопками Yes и No и пик-
торгаммой вопросительного знака. Поразрядная операция or факти-
чески комбинирует две константы бит за битом. Полученный в ре-
зультате стиль представляет собой комбинацию обоих стилей.
Имейте в виду, что некоторые стили взаимноисключающие. Их
комбинирование может дать непредвиденные или нежелательные ре-
зультаты.
Типы функций Windows
-----------------------------------------------------------------
Ниже перечислены виды функций Windows, которые вы можете ис-
пользовать в своих программах ObjectWindows.
Функции интерфейса с администратором Windows
Эти функции выполняют обработку сообщений, манипулируют ок-
нами и диалоговыми блоками и создают системный вывод. Данная ка-
тегория включает в себя функции для меню, курсоров и буфера выре-
занного изображения.
Функции интерфейса
с графическими устройствами (GDI)
Эти функции выводят на разнообразные устройства (включая эк-
ран и принтер) текст, графику и битовые массивы. Они не привязаны
к конкретному устройству и являются независимыми от устройства.
Функции интерфейса со служебными функциями системы
Эти функции работают с широким диапазоном системных уст-
ройств, включая управление памятью, взаимодействие с операционной
системой, администрирование ресурсов и коммуникации.
Функции системного вызова
-----------------------------------------------------------------
Windows содержит ряд функций, которые позволяют вам прохо-
дить в цикле (или перечислять) определенные типы элементов в сис-
теме Windows. Например, перечислить шрифты системы и напечатать
образец текста, используя каждый из них. Чтобы использовать такую
функцию, вы должны передать указатель на нее (указатель системной
функции), и Windows будет использовать его в процессе перечисле-
ния. Данная функция при итерации по списку характеристик окна,
окон, дочерних окон, шрифтов и т.д. вызывается непосредственно
Windows.
Функции Windows, требующие функций системного вызова (или
повторного вызова), включают в себя: EnimChildWindows,
EnumClipboardFormats, EnumFonts, EnumMetaFile, EnumObjects,
EnumPops, EnumTaskWindows и EnumWindows.
Функция системного вызова должна быть обычной функцией, а не
методов объекта. Указатель на эту функцию передается в качестве
первого параметра (типа TFarProc) данных методов. Например, если
вы определили в Паскале функцию системного вызова ActOnWindow
следующим образом:
function ActOnWindow(TheHandle: HWnd; The Value: Longint):
Integer; far; export;
то можете передать ее в качестве функции системного вызова при
вызове функции Windows EnumWindows:
ReturnValue := EnumWindows(TFarProc(ActOnWindow), ALongint);
Функция системного вызова должна иметь тот же тип возвращае-
мого значения, что и вызывающая ее функция Windows. Функция
ActOnWindows будет выполнять некоторое действие с окном, заданным
переданным указателем. Параметр TheValue - это любое значение,
выбранное для передачи в вызывающей программе.
Директива компилятора {$K+} позволяет автоматически управ-
лять функциями системного вызова. Если вы не выбираете {$K+}, то
для возврата адреса, по которому будет выполнять вызов Windows,
должны передавать свои функции системного вызова через функцию
API MakeProcInstance.
Назад | Содержание | Вперед