Глава 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 представлены объекты иерархии, используемые для управления данными и проверки их допустимости.

     Модуль 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.


Рис. 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. Часто ObjectWindows автоматически подставляет параметры, такие как описатели окон и идентификаторы дочерних окон, которые хранятся в интерфейсных объектах в виде полей.

    Например, многие функции 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.