Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Delfi, лекции / Зан Форма

.doc
Скачиваний:
15
Добавлен:
28.03.2016
Размер:
977.92 Кб
Скачать

12

Форма

Форма является основным «строительным блоком» в Delphi. Любая программа имеет как минимум одну связанную с ней форму, которая называется главной, - эта форма появляется на экране в момент старта программы. Однако программа может иметь сколько угодно форм, каждая из которых может решать ту или иную локальную задачу и появляться на экране по мере надобности.

Разновидности форм

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

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

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

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

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

Стиль fsStayOnTop предназначен для окон, которые всегда должны располагаться над всеми другими окнами программы. В момент активизации окна оно обычно становится видимым на экране, даже если перед этим его загораживали другие раскрытые окна. Стиль fsStayOnTop препятствует перекрытию окна другими окнами, даже если оно становится неактивным и теряет фокус ввода (так сказано в документации, однако на самом деле это не так, см. ниже).

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

Например

Первым параметром обращения к функции является дескриптор окна, которое должно стать всплывающим. Дескриптор формы содержится в ее свойстве Handle, поэтому для формы fmAlarmForm параметр вызова имеет вид fmAlarmForm.Handle.

Второй параметр определяет расположение окна относительно других окон в так называемом Z-порядке их расположения. Константа hwnd_TopMost указывает, что окно должно стать самым верхним и впредь до его закрытия не может перекрываться другими (обычными) окнами.

Четыре следующие параметра определяют координаты левого верхнего угла окна, его ширину и высоту. Все параметры указываются в пикселах, координаты угла задаются относительно левого верхнего угла экрана.

Последним указывается один или несколько битовых флагов, уточняющих поведение окна. В нашем примере использован флаг swp_noActivate, означающий, что окно не получает фокуса ввода в момент своего появления на экране.

Всплывающим может стать и обычное окно (FormStyle=fsNormal). Однако всплывающее окно действительно появится на экране, только если в его свойстве Visible содержится значение True. Иными словами, если пользователь закроет такое окно, оно не появится в результате вызова функции SetWindowPos - его предварительно нужно сделать видимым методом Show.

Поскольку всплывающее окно может вызываться в разных местах программы, удобно поместить вызов функции SetWindowsPos в его обработчик события OnActivate. Если при попытке создать обработчик для окна FormStyle=fsStayOnTop, компилятор выдаст сообщение об ошибке и поместит заготовку метода в тексте модуля после ограничителя-точки (.). В этом случае необходимо определять окно со стилем fsNormal.

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

Для создания форм в этом случае используется стиль fsNormal.

В хранилище объектов Delphi хранится множество стандартных форм-заготовок, предназначенных для решения конкретных задач (доступ к хранилищу объектов открывает команда File - New - Other). Помимо универсальной пустой формы Form (вкладка New хранилища объектов) хранилище содержит специализированные формы, некоторые из которых перечислены в табл. 1.1.

Таблица 1.1

Компонент TForm

Рассмотрим свойства, методы и события формы, то есть компонента TForm.

Свойства формы представлены в табл. 1.2.

Таблица 1.2

Таблица 1.2(продолжение)

Таблица 1.2(продолжение)

Таблица 1.2(продолжение)

Два свойства AlphaBlend и AlphaBlendValue впервые введены в версии 6 и позволяют регулировать степень прозрачности окна формы.

Если AlphaBlend=True, то значение свойства AlphaBlendValue задает степень прозрачности: 0 - окно полностью прозрачно, 255 - окно совершенно непрозрачно.

Свойства TransparentColorValue и TransparentColor определяют цвет прозрачности и возможность его использования.

Показываемое окно должно быть действительно прозрачно - сквозь него видны не только значки рабочего стола, но на них даже можно щелкать мышью и вызывать программы.

После щелчка на верхней кнопке начинается плавное изменение значения AlphaBlendValue от 255 до 0 и обратно. В результате окно «растворяется» на экране, а затем появляется вновь.

Примечание

Если во множестве свойства BorderIcon убрать кнопки biMinimize и biMaximize, а в свойство WindowState поместить значение wsMaximized, форма займет все пространство экрана, включая панель задач.

Методы формы перечислены в табл. 1.3.

Таблица 1.3

Таблица 1.3(продолжение)

Структура Params в методе CreateParams описывается следующим типом:

Этот метод следует перекрыть, если вы хотите создать окно нестандартного типа.

Например, набор возможных значений свойства BorderStyle не предполагает создания окна с «толстой» рамкой, но без заголовка. Однако если в свойство Раrams.Style поместить значение WS_THICKFRAME or WS__POPUP, такое окно будет создано.

Сообщение WM_NCHITTEST посылает Windows в момент создания окна при любом изменении его нерабочей области (заголовка, рамки, полос прокрутки и т.п.), а также при перемещении на нем указателя мыши. Обычно программы его не обрабатывают, но в нашем случае обработчик этого события «обманывает» Windows и сообщает операционной системе, что указатель перемещается на области заголовка.

События формы перечислены в табл. 1.4.

Таблица 1.4

Создание и использование форм

Для подключения новой формы к проекту достаточно обратиться к хранилищу объектов и выбрать нужную разновидность формы. Менеджер проекта автоматически подключает новую форму к списку используемых форм и обеспечивает все необходимые действия по ее инициализации.

Самая первая подключенная к проекту форма (стандартное имя формы – Form1) становится главным окном программы. Окно этой формы автоматически появляется на экране в момент старта программы.

Программист может указать любую форму, окно которой станет главным. Для этого нужно обратиться к команде Project - Options, в открывшемся окне перейти на вкладку Forms и в списке Main form выбрать нужную форму (рис.1.5).

Каждое следующее окно становится видимым только после обращения к его методу Show или ShowModal.

Чтобы обратиться к этим методам, нужно сослаться на объект-окно, который автоматически объявляется в интерфейсном разделе связанного с окном модуля. Для этого, в свою очередь, главное окно должно знать о существовании другого окна, что достигается ссылкой на модуль окна в предложении Uses.

Если, например, в ходе выполнения одного из методов главного окна программист захочет вызвать окно с именем fmForm, связанное с модулем FormUnit, он должен сослаться на этот модуль в предложении Uses главного окна:

Delphi автоматизирует вставку ссылки на модуль в предложение Uses.

Для этого на этапе разработки нужно активизировать главное окно, щелкнув на нем мышью, после чего обратиться к команде File - Uses Unit. В появившемся диалоговом окне (рис.1.6) нужно выбрать модуль и щелкнуть на кнопке ОК.

Вставляется ссылка в предложение, стоящее за зарезервированным словом Implementation, так как обычно главное окно в своей интерфейсной части не ссылается на элементы интерфейсной части второго окна.

Точно так же можно при необходимости сослаться в модуле второго окна на модуль главного окна: активизируйте второе окно и вновь выберите команду File - Uses Unit.

Если программист забудет сослаться на модуль, подключенный к проекту, Delphi при первой же трансляции программы сообщит об этом и предложит вставить недостающую ссылку.

Рис.1.5 Рис.1.6

При вызове метода Show второе окно появляется на экране и работает вместе с первым, поэтому управление сразу передается оператору, стоящему за обращением к этому методу.

Такие окна называются немодальными, они всегда открываются в одном методе, а закрываются в другом. В отличие от этого обращение к методу ShowModal создает модальное окно, которое полностью берет на себя дальнейшее управление программой, поэтому оператор, расположенный следом за обращением к методу ShowModal в вызывающей части программы, получит управление только после закрытия модального окна.

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

Если от пользователя требуется принятие решения, в модальное окно вставляются флажки, переключатели, кнопки и другие интерфейсные элементы, с помощью которых пользователь может сообщить программе о принятом решении.

В момент завершения диалога модальное окно должно поместить число, соответствующее решению пользователя, в свое свойство ModalResult. Некоторые стандартные кнопки (OK, Yes, No, Cancel и т.п.) автоматически выполняют эти действия: помещают нужное число в свойство ModalResult и закрывают окно. В других случаях об этом должен позаботиться программист.

Вызывающая программа получает значение свойства ModalResult как возвращаемое значение функции ShowModal и может тут же его проанализировать:

Для закрытия окна (модального или немодального) используется метод Hide или Close. Следует учесть, что метод Close всегда помещает в свойство ModalResult значение 2 (mrCancel), в то время как метод Hide не меняет значения этого свойства, поэтому, если программист хочет передать в вызывающую программу нестандартный модальный результат, следует ввести в программу следующие операторы:

По умолчанию среда Delphi настроена так, что при подключении нового окна к проекту менеджер проекта размещает его имя в списке автоматически создаваемых окон (на рис.1.5 это список Auto-Create forms). В этом случае программист может не заботиться об инициализации соответствующего объекта окна.

Однако если в программе используется множество окон, их автоматическое создание в момент старта программы может существенно затянуть процесс ее загрузки. В то же время немедленное создание всех окон вовсе не обязательно, так как вряд ли вам понадобится одновременно показывать их на экране в немодальном режиме.

Профессиональные программисты никогда не создают все оконные объекты в момент старта программы, но используют их по мере надобности. Для этого снимается флажок Auto create forms & data modules на вкладке Designer окна Environment Options (открывается командой Tools - Environment Options) или в окне менеджера проекта (см. рис.1.5) ссылки на эти формы переносятся в список Available forms, а обращение к окну реализуется так:

Соседние файлы в папке Delfi, лекции