
- •1.Компоненты Button и BitBtn
- •2.Компоненты Edit, label.
- •3. Компоненты ComboBox, ListBox.
- •4. Компоненты CheckBox, RadioButton.
- •5.Компоненты StringGrid, DrawGrid.
- •Как узнать координаты ячейки при щелчке мышкой
- •Графические возможности компонента StringGrid
- •Совместная работа StringGrid и Excel
- •6.Компоненты ScrollBar, TrackBar.
- •7.Компоненты Form, Panel.
- •8.Компоненты Shape, Image
- •9.Компоненты MainMenu, PopupMenu
- •10.Компоненты TabControl, PageControl
- •11.Компоненты FontDialog, ColorDialog
- •12.Функции InputBox, ShowMessage, MessageDlg
7.Компоненты Form, Panel.
Форма (TForm)
Последним в этом разделе будет рассмотрен самый важный, особый компонент — форма. Форма в Delphi — это синоним окна. В библиотеках для Windows (MFC, OWL) существуют отдельные классы для каждой важной разновидности окон — диалогового окна, клиентских и дочерних окон MDI и так далее. Разработчики VCL пошли по новому пути, объединив в одном классе свойства и методы всех этих разновидностей. Специализация при этом все равно осталась — она определяется свойством:
(Рb) property FormStyle: TFormStyle; TFormStyle = [fsNoririal, fsMDIChild, fsMDIForm, fsStayOnTop);
fsNormal — обычное окно;
fsMDIChild — дочернее окно приложения MDI;
fsMDIForm — главное окно MDI;
fsStayOnTop — окно, остающееся поверх других даже в неактивном состоянии. (В данном случае это касается только других окон приложения).
Такая разновидность, как диалоговое окно, не имеет собственного стиля. Каким образом реализуются его особенности, описано ниже.
У TForm есть методы, которые имеют смысл только для некоторых из стилей FormStyle. Рассмотрим сначала общие свойства и методы формы, а затем — специфические.
Набор пиктограмм в заголовке окна описывается свойством:
(Рb) property Borderlcons: TBorderIcons; TBorderIcon = (biSystemMenu, biMiniinize, biMaximize); TBorderIcons = set of TBorderIcon;
По умолчанию у обычной формы имеются все три пиктограммы — для вызова системного меню, разворачивания и сворачивают окна.
Обрамление формы задается свойством:
(Pb) property BorderStyle: TFormBorderStyle; TFormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog);
Помимо двух стандартных стилей обрамления (bsNone и bsSingle) у формы есть еще два своих типа (bsSizeable и bsDialog). Эти возможности стандартны для Windows. Особенности реализации здесь заключаются в том, что стиль обрамления может изменяться в процессе выполнения программы.
Каждое окно может находиться в одном из состояний — нормальном, свернутом (минимизированном) и развернутом (максимизированном), что определяется свойством:
property WindowState: TWindowState; TWindowState = [wsNormal, wsMinimized, wsMaximized);
Значение этого свойства можно изменить как на этапе разработки, так и во время исполнения.
Окно в свернутом состоянии на экране отображается значком формы, который задается в свойстве:
(Pb) property Icon: TIcon;
Значок главной формы приложения идентифицирует само приложение в TaskManager Windows 3.11 и Windows NT или TaskBar Windows 95. Если он не определен, то используется значок приложения (объекта Application).
Каждая форма может иметь главное и всплывающее меню. Главное меню определяется свойством:
(Рb) property Menu: TMainMenu;
Оно может быть у каждой формы (и только у формы). Для того чтобы не возникало путаницы с несколькими одновременно видимыми меню в одном приложении, у компонентов TMainMenu предусмотрена возможность объединения в одном.
Всплывающее меню формы представлено свойством:
(Pb) property PopupMenu: TPopupMenu;
Форма может содержать объекты OLE. Для этого она должна быть зарегистрирована в качестве их приемника. Свойство
property DropTarget: Boolean;
устанавливает, может ли форма быть приемником объектов OLE. Для размещения подменю возможностей сервера OLE можно выделить отдельный пункт:
(Pb) property ObjectMenuItem: TMenuItem;
Этот пункт будет активизироваться при получении фокуса компонентом TOLEContainer.
Панели Panel используются наиболее широко. С их помощью компонуются различные элементы интерфейса (кнопки, окна редактирования, списки), функционально связанные друг с другом. Такая функциональная связь должна поддерживаться и зрительной связью — объединением соответствующих элементов в рамках одной панели. Панели Panel могут также использоваться для организации инструментальных панелей, полос состояния и т.п., хотя для этих целей имеются и специализированные компоненты, которые будут рассмотрены позднее.
Одним из назначений панелей является также группирование таких управляющих элементов, как RadioButton — радиокнопки (см. раздел 5.4). Все радиокнопки, расположенные на панели, работают как согласованная группа: в любой момент может быть выбрана только одна из них. Аналогично согласованной группой работают и расположенные на панели быстрые кнопки SpeedButton (см. раздел 5.3), если они имеют одинаковое значение свойства GroupIndex. В то же время SpeedButton, расположенные на разных панелях или на панели и форме, не образуют связанной группы даже при одинаковом значении GroupIndex.
Внешний вид панели Panel определяется совокупностью параметров BevelInner — стиль внутренней части панели, BevelOuter — стиль внешней части панели, BevelWidth — ширина внешней части панели, BorderStyle — стиль бордюра, BorderWidth — ширина бордюра. Результат сочетания некоторых значений этих параметров показан на рис. 7.1. Верхняя панель соответствует значениям параметров по умолчанию. Нижняя панель соответствует случаю, когда не определен стиль ни одной из областей панели (значения всех параметров равны None), В этом случае сама панель никак не выделяется на форме. Видна только надпись на ней (свойство Caption), если надпись задана, и, конечно, видны те компоненты, которые размещаются на панели.
Если вы строите приложение, в котором разрешаете пользователю изменять размер окна, надо позаботиться о том, чтобы синхронно с этим изменялись и размеры панелей. В разделе 3.3.2 уже коротко говорилось о свойствах Align, Anchors и Constraints, которые позволяют решить эту задачу. Но в ряде приложений этого мало. В зависимости от ситуации какие-то панели в приложении могут оказаться временно перегруженными отображаемыми данными, а другие в значительной степени пустыми. В этих случаях полезно предоставить пользователю возможность перемещать границы, разделяющие различные панели, изменяя их относительные размеры. Пример такой возможности вы можете увидеть в программе Windows «Проводник».
В библиотеке Delphi имеется специальный компонент — Splitter, который позволяет легко осуществить это. Рассмотрим это на примере. Пусть вы хотите иметь в приложении форму, содержащую три панели, которые располагаются так, как показано на рис. 7.2. При изменении пользователем размеров окна панель Panel1 должна в любом случае занимать всю нижнюю часть окна, не увеличиваясь в высоту. Панель Panel2 должна занимать левую часть окна, изменяя при изменении размеров окна свою высоту, но не изменяя ширину. А панель Panel3 должна занимать всю оставшуюся часть окна. Кроме того мы хотим обеспечить пользователю возможность изменять положение границы между панелями Panel2 и Panel3, расширяя одну из этих панелей и соответственно сжимая другую.
Исходя из наших требований свойство Align надо установить у панели Panel1 в alBottom (выравнивание по нижнему краю окна), у панели Panel2 — в аlLeft (выравнивание по левому краю окна), у панели Panel3 — в alClient (выравнивание по всей оставшейся части клиентской области окна). А между Panel2 и Panel3 надо разместить Splitter — разделитель.
Рис. 7.2 Панели с разделителем |
а) |
|
б) |
|
Последовательность проектирования такой формы может быть следующей;
Разместите на форме панель Panel1 и задайте у нее Align = alBottom. Панель займет нижнюю часть окна.
Разместите на форме панель Panel2 и задайте у нее Align = alLeft. Панель займет левую часть окна.
Разместите на форме разделитель Splitter и задайте у него Align = alLeft (впрочем, это значение Align установлено по умолчанию). Разделитель прижмется к правой стороне панели Panel2, которая уже выровнена в ту же сторону. Разделитель всегда надо выравнивать только после выравнивания соответствующей панели, так как иначе он прижмется просто к краю формы.
После этого можно разместить на форме панель Panel3 и задать у нее Align = alClient. Разделитель окажется зажатым между Panel2 и Panel3.