Новые разделы!
ИИ, квантовые вычисления и много других интересных тем
Глава 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.
Назад | Содержание | Вперед