19.1. РАЗНОВИДНОСТИ ФОРМ

Разновидности форм определяются значениями их свойств FormStyle, а также разнообразием форм-заготовок, хранящихся в репозитории Delphi.

Стиль формы задается одним из значений свойства

TFormStyle = (fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop) ;

property FormStyle: TFormStyle;

Стиль fsNormal определяет обычную форму, использующуюся для решения самых различных задач, в том числе - для общего управления всей программой (главная форма).

Стили fsMDIChild и fsMDIForm используются при создании так называемых многодокументных приложений в стиле MDI (MDI -Multi Document Interface). Этот немодный сегодня стиль предполагает создание главного окна MDI (его обычно называют рамочным), внутри которого по мере надобности появляются дочерние окна.' Дочерние окна, подобно дочерним элементам контейнера, не могут выходить за границы своего владельца - рамочного окна. В MDI-приложениях есть специальные средства управления взаимодействием рамочного окна с дочерними окнами. Например, каждое дочернее окно в момент активизации может нужным образом настроить главное меню рамочного окна (дочерние MDI-окна не имеют собственного главного меню). В Delphi для создания рамочного окна используется стиль fsMDIForm, а для создания дочернего MDI-окна - стиль fsMDIChild.

Стиль fsStayOnTop предназначен для окон, которые всегда должны располагаться над всеми другими окнами программы[ В терминологии Windows такие окна называются Popup Window, что буквально переводится как окно-поплавок. ]. В момент активизации окна оно обычно становится видимым на экране, даже если перед этим его загораживали другие раскрытые окна. Стиль fsStayOnTop препятствует перекрытию окна другими окнами, даже если оно становится неактивным и теряет фокус ввода (так сказано в документации, однако на самом деле это не так, см. ниже). Понятно, что этот стиль используется в исключительных случаях, когда окно содержит что-то, требующее повышенного внимания пользователя.

Как показывает практика, объявление окна со стилевым признаком fsStayOnTop еще не решает проблему создания окна-поплавка, т. е. окна, которое невозможно перекрыть другими окнами. Более того, несложные эксперименты убедят вас, что этот признак вообще не играет никакой роли! Чтобы создать окно-поплавок, нужно обратиться к API-функции SetWindowPos.

Например:

SetWindowPos(fmAlarmForm.Handle, hwnd_TopMost, 300, 300, 250, 70, swp_noActvate)

Полное описание этой функции (как и всех других API-функций Windows) вы найдете в Help-файлах WIN32.HLP или WIN32SDK.HLP, которые поставляются вместе с Delphi и по умолчанию располагаются В папке Program Files | Common Files | Borland shared | MSHelp. Здесь я лишь кратко поясню назначение параметров вызова.

Первым параметром обращения к функции является дескриптор окна, которое должно стать “поплавком”. Напомню, что дескриптор формы содержится в ее свойстве Handle, поэтому для формы fmAlarmForm параметр вызова имеет вид fmAlarmForm. Handle. вторым параметром определяется расположение окна относительно других окон в так называемом Z-порядке их расположения. Константа nwnd_TopMost указывает, что окно должно стать самым верхним и впредь до его закрытия не может перекрываться другими (обычными) окнами. Четыре следующие параметра определяют координаты левого верхнего угла окна, его ширину и высоту. Все параметры указываются в пикселях, координаты угла задаются относительно, левого верхнего угла экрана. Последним указывается один или несколько битовых флагов, уточняющих поведение окна. В нашем примере использован флаг swp_noActvate, означающий, что окно не получает фокуса ввода в момент своего появления на экране. Поясню, что на практике я часто использую окна-поплавки, чтобы сообщить пользователю, например, о необходимости обновить набор данных, которые он видит в настоящий момент, так как эти данные были изменены другими пользователями клиент-серверной БД. Такое окно не должно отнимать активность (фокус ввода) у окна, с которым работает пользователь.

И последнее замечание. “Поплавком” может стать и обычное окно (со значением FormStyle=fsNormai). Однако “поплавок” действительно появится на экране, только если в его свойстве visible содержится значение True.

Иными словами, если пользователь закроет такое окно, оно не появится в результате вызова функции setwindowpos - его предварительно нужно сделать видимым методом show. Поскольку окно-поплавок может вызываться в разных местах программы, удобно поместить вызов функции setwindowspos в его обработчик события onActivate. Однако если вы попытаетесь создать такой обработчик для окна со стилем FormStyle=fsStayonTop, то компилятор выдаст сообщение об ошибке и поместит заготовку метода в тексте модуля после ограничителя “.”. В этом случае определяйте окно со стилем fsNormal.

Современные многооконные приложения чаще всего строятся в стиле SDI (SDI - Single Document Interface), который в противоположность MDI не накладывает ограничений на положение и размеры вспомогательных форм, каждая из которых при необходимости может иметь свое главное меню (в стиле SDI реализована, например, среда Delphi). Для создания форм в этом случае используется стиль fsNormal.

Замечу, что в рамках SDI-приложений могут использоваться рамочные MDI-формы со своими дочерними окнами, так что термин SDI носит весьма условный характер и применяется в основном для противопоставления давно используемому термину MDI.

В репозитории Delphi хранится множество стандартных форм-заготовок, предназначенных для решения конкретных задач (доступ к репозиторию открывает опция меню File | New | other).

Помимо универсальной пустой формы Form (страница New peno-зитория) репозитории содержит следующие специализированные формы:

Название | Страница | Назначение
About box | Forms | Окно 0 программе
Dual list box | Forms | Диалоговое окно с двумя компонентами ListBox. Используется для гибкого управления списками, в том числе для перемещения элементов из одного списка в другой

Quick Report Labels | Forms | Используется в приложениях баз данных для печати этикеток

Quick Report List | Forms | Используется в приложениях баз данных для создания обычных отчетов
Quick Report Master/Detail | Forms | Используется в приложениях баз данных для создания отчетов типа главный/детальный
Tabbed Pages | Forms | Заготовка для многостраничного диалогового окна с закладками, кнопками ok, cancel и Help
Dialog with Help | Dialogs | Заготовка для диалогового окна с кнопками ok. Cancel, Help. Имеются варианты с вертикальным асположением кнопок и с горизонтальным расположением
Password Dialog | Dialogs | Диалоговое окно с редактором TEdit, кнопками ok и Cancel для ввода паролей
Reconcile Error Dialog | Dialogs | Используется в приложениях баз данных для пояснения обнаруженной ошибки при изменении таблицы
Standard Dialog | Dialogs | Заготовка для диалогового окна с кнопками ok, cancel. Имеются варианты с вертикальным расположение кнопок и с горизонтальным расположением
Dialog Wizard | Dialogs | Мастер создания диалоговых окон
Decision Cube Sample | Business | Заготовка для использование компонентов страницы Decision Cube
Database Form Wizard | Business | Мастер создания форм для доступа к базам данных

Quick Report Wizard | Business | Мастер создания отчетов для баз данных

TeeChart Wizard | Business | Мастер форм для доступа к компоненту chart