Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Всплывающие формы в XE5

Author: Oliver

TCommonCustomForm.FormStyle

В XE5, вместо свойств StaysOpen, ShowActivated и TopMost появилось свойство FormStyle. Это свойство управляет поведением формы как и аналогичное свойство в VCL (не путайте со StyleBook, которое управляет визуальными стилями формы). Может принимать одно из трех значений:

TFormStyle = (fsNormal, fsPopup, fsStayOnTop);

Смысл fsNormal и fsStayOnTop довольно очевиден. Это обычная форма и форма которая находится всегда поверх обычных форм. Если раньше было установлено свойство TopMost, то FormStyle получит значение TFormStyle.fsStayOnTop.
Два значения fsMDIForm и fsMDIChild отсутствуют, т. к. эти значения могли бы использоваться только в Windows.

Интерес я думаю представляет значение fsPopup. Это особая форма которая используется в комбинированных списках и меню. Если раньше одно из свойств StaysOpen, или ShowActivated имело значение False, то FormStyle получит значение TFormStyle.fsPopup.

Всплывающая форма имеет отличное от других форм поведение:

Для всплывающих форм, также характерны следующие значения свойств:

BorderStyle := TFmxFormBorderStyle.bsNone; // Отсутствует рамка окна
Popup.Transparency := True;  // Форма имеет прозрачный фон

TCommonCustomForm.ParentForm

Для определения «родственных связей» форм, добавлено свойство ParentForm. Значение этого свойства устанавливается, когда Вы меняете свойство Parent. Если объект Parent является формой, он же будет использован в качестве ParentForm, иначе будет определена форма на которой лежит объект Parent.
После изменения ParentForm выполняется виртуальный метод DoParentFormChanged.

Надо отметить, что изменение таких свойств как FormStyle, BorderStyleParentForm, приводит к пересозданию формы и всех контролов на ней и всех дочерних форм. Поэтому я не рекомендую менять эти свойства в Run-time, после того как форма уже была отображена на экране.

TCustomPopupForm

Для упрощения создания всплывающих форм, создан специальный класс форм TCustomPopupForm, который используется в TPopup, TComboEdit, TPopupBox, TMenuBar и т.п. У форм данного класса по умолчанию нет рамки и фона. После закрытия происходит автоматическое разрушение. При создании не производится поиск fmx-файла формы, т. е. этот класс ориентирован только на работу в Run-time.

Поскольку у форм данного класса не видны ни рамка ни фон и они не должны выходить за границы экрана, физические координаты окна не имеют большого практического значения. Управление расположением формы осуществляется с помощью других свойств: PlacementPlacementTargetPlacementRectangle, Size. Самостоятельно менять Position, Height, Width не надо.

Экземпляры таких форм создаются с использованием конструктора:

constructor Create(AOwner: TComponent; AStyleBook: TStyleBook = nil; APlacementTarget: TControl = nil); reintroduce;

Здесь AStyleBook указывает стили используемые формой, а APlacementTarget указывает контрол рядом с которым должна появиться форма.

PlacementTarget — некоторый контрол в окрестностях которого, определенным образом располагается форма (здесь и далее для обозначения такого размещения позвольте использовать слово «прилипать»). Если он задан, то расчет экранных координат формы осуществляется относительно данного контрола, иначе относительно левого верхнего угла экрана.

PlacementRectangle — координаты прямоугольника к которому осуществляется «прилипание» формы. Расчет экранных координат PlacementRectangle, осуществляется относительно PlacementTarget если он задан, иначе относительно левого верхнего угла экрана.

ScreenPlacementRect — экранные координаты прямоугольника к которому осуществляется «прилипание» с учетом PlacementTarget и PlacementRectangle. На рисунке обозначен малиновым цветом.

Placement — вариант размещения формы. В большинстве случаев для определения координат формы также используется прямоугольник ScreenPlacementRect.

На этом рисунке изображена всплывающая форма в которую помещен прямоугольник TRectangle с эффектом тени TShadowEffect. Прямоугольник выравнивается по всей клиентской области alClient. Различными цветами представлены некоторые важные свойства. Проект Вы можете загрузить здесь.

Padding — это свойство как и в обычной форме задает отступы от краёв клиентской области формы. По этим отступам будут выравниваться все контролы на форме. На рисунке это серый квадрат (с зеленой рамкой). По умолчанию используются значение 8, чтобы эффекты (например тень) не обрезались физическими границами окна.

Size — размер рабочей области формы. Как видно на рисунке физические размеры окна (красный пунктир) представляют малый интерес. Данное свойство (зеленый пунктир) задает те размеры по которым будут выравниваться все контролы. Размеры формы ClientWidth, ClientHeight устанавливаются автоматически с учетом Size и Padding. Если задано свойство PlacementRectangle и Placement имеет значение plAbsolute, то Size игнорируется.

ContentPadding — задает отступы от рабочей области формы, к которым осуществляется «прилипание».

ScreenContentRect — экранные координаты прямоугольника, к которому осуществляется «прилипание». Это прямоугольник внутри которого расположено полезное содержимое формы. Некоторые декоративные элементы (например треугольничек в CalloutPanel) могут вылезать за границы формы, или на кнопку.

Offset — смещение всплывающей формы. Это свойство указывает на сколько пикселей надо сместить форму относительно того расположения, которое было получено с учетом рассмотренных ранее свойств. В зависимости от Placement меняется направление смещения. Это свойство используется к примеру в многоуровневых меню, когда новые формы располагаются внахлест.

DragWithParent — это свойство указывает, надо ли перемещать форму после того как она была показана. Например: если Placement имеет значение plMouse или plMouseCenter то форма будет перемещаться вслед за курсором мыши. На мобильных устройствах, после смены ориентации (портрет/ландшафт) форма будет менять расположение чтобы не оказаться частично за пределами экрана.

Извините получилось довольно много букв, надеюсь что хоть часть текста оказалась понятной.

Exit mobile version