Группирование компонентов Delphi

В приложениях VCL Forms форма является первичным контейнером для компонентов. Помимо формы, Delphi предлагает несколько других компонентов, которые могут содержать в себе другие компоненты. Такие компоненты называются контейнерными. Стандартными контейнерными компонентами являются TGroupBox и TPanel категории Standard, TScrollBox категории Additional (Дополнительные) и TPageControl категории Win32.

Как правило, группировать компоненты необходимо по двум причинам. Работа с группами компонентов на этапе проектирования будет более продуктивной, поскольку работать с группой компонентов можно как с одним модулем. А во время выполнения группы улучшают качество интерфейса пользователя. Использование некоторых контейнерных компонентов, таких как TGroupBox, позволяет улучшить внешний вид приложения. Например, в диалоговом окне Project Options (Параметры проекта) компонент TGroupBox используется для группирования связанных между собой параметров. Рамки Code generation (Генерация кода). Syntax options (Параметры синтаксиса). Runtime errors (Ошибки времени выполнения) и Debugging (Отладка), видимые в диалоговом окне, являются компонентами TGroupBox, каждый из которых содержит по нескольку флажков (рис. 11.20).

Чтобы добавить компоненты-потомки в контейнерный компонент, лучше всего сначала поместить контейнерный компонент в окно Designer Surface. Когда вы перемещаете компоненты в окно Designer Surface, они добавляются в контейнерный компонент в позицию указателя мыши. Если в окне Designer Surface нет дополнительных контейнерных компонентов, компоненты добавляются прямо на форму. Если ваша форма содержит несколько контейнерных компонентов, то разобраться с ними вам поможет окно Structure (Структура), показанное на рис. 11.21.

Рис. 11.20. Компоненты TGroupBox в диалоговом окне Project Options

Рис. 11.21. Отношения между родителями и потомками на форме

 

 

Компоненты, с которыми вы работаете на этапе проектирования, являются экземплярами реальных объектов. Когда вы переносите компонент из окна Tool Palette в окно Designer Surface. IDE-среда вызывает соответствующий конструктор для создания экземпляра объекта.
Конструктор компонента отличается от стандартного конструктора объекта. Конструктор компонента принимает параметр TComponent:
1.constructor Create(AOwner: T<a href="http://delphicomponent.ru/" title="Component" target="_blank">Component</a>);
Параметр AOwner используется для определения владельца компонента. Компонент-владелец отвечает за освобождение памяти, занятой принадлежащими ему компонентами. При проектировании приложений в IDE-среде Delphi форма автоматически становится владельцем всех компонентов.
Чтобы убедиться в этом, достаточно поместить кнопку в окно Designer Surface, а в обработчике событий onclick написать следующую строку кода:
1.procedure TForml.ButtonlClick(Sender: TObject); begin
2.Caption := 'The Owner of Buttonl is ' + Buttonl.Owner.Name; end;
В то время как компоненты могут иметь только свойство Owner (Владелец), элементы управления (компоненты, порожденные от класса TControl) имеют свойства Owner и Parent (Родитель). Родительский элемент управления отвечает за отображение элемента управления на экране. Все контейнерные компоненты могут быть родительскими. Если вы переносите на форму компонент, то форма становится и владельцем, и родителем этого компонента. Если вы добавляете компонент в контейнерный компонент, подобный TPanel, то компонент TPanel становится родительским (Parent) компонентом.
В этом можно убедиться на деле. Давайте поместим на форму компонент TPanel и добавим в него кнопку. Вы можете изменить родителя кнопки на этапе проектирования, используя буфер обмена или окно Structure (Структура). Чтобы сделать это с помощью буфера обмена, выполните следующие шаги:
  • Выберите компонент и вырежьте его в буфер обмена с помощью команды меню Edit^Cut (ПравкамВырезать).
  • Выберите компонент панели в окне Designer Surface.
  • Воспользуйтесь командой меню Edit^Paste (Правка^Вставить), чтобы добавить ранее вырезанную кнопку в панель.
Однако перенести кнопку в панель проще всего можно с помощью окна Structure — в этом случае достаточно перетащить кнопку из этого окна с помощью мыши (рис. 11.22).
Рис. 11.22. Изменение родителя компонента на этапе проектирования
Теперь, когда кнопка находится в панели, мы можем, например, с помощью процедуры ShowMessage вывести именакомпонентов Parent и Owner. Процедура ShowMessage представляет собой очень простое сообщение, принимающее однострочный параметр и отображающее окно сообщения с кнопкой ОК, как показано на рис. 11.23. Объявление процедуры ShowMessage находится в модуле Dialogs.
Листинг 11.3. Отображение информации о родителе и владельце
01.unit Unit1;
02.interface
03.uses
04.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
05.Dialogs, StdCtrls, ExtCtrls;
06.type
07.TForm1 = class(TForm)
08.Panel1: TPanel;
09.Button1: TButton;
10.procedure Button1Click(Sender: TObject);
11.private
12.{ Private declarations }
13.public
14.{ Public declarations }
15.end;
16.var  Form1: TForm1;
17.implementation
18.{$R *.dfm}
19.procedure TForm1.Button1Click(Sender: TObject);
20.begin
21.ShowMessage('Owner: ' + Button1.Owner.Name);
22.ShowMessage('Parent: ' + Button1.Parent.Name);
23.end;
24.end.
И последнее, о чем следует упомянуть в отношении контейнерных компонентов, это использование памяти. Контейнерные элементы управления действительно являются полезными и незаменимыми, если нужно сгруппировать компоненты, однако это вовсе не означает, что их следует применять повсеместно в качестве графических декораций формы.
К примеру, компонент TPanel часто используется при создании рамки для группы компонентов. Если свойству Bevellnner присвоить значение bvRaised, а свойству BevelOuter — значение bvLowered, то края бордюра панели будут скошенными — внутренний край будет находиться выше внешнего края. Если вам необходима просто рамка, без функциональностикомпонента TPanel, то для этого следует использовать компонент TBevel.
Компонент TBevel является графическим компонентом, который не может содержать другие компоненты, и использует меньшее количество системных ресурсов, чем компонент TPanel. Компонент TBevel предназначен только для отображения на форме рамки со скошенными краями бордюра. Чтобы отобразить рамку на форме, присвойте свойству Shape компонентаTBevel значение bsFrame (рис. 11.24). Компонент TBevel можно найти в категории Additional в окне Tool Palette.
Рис. 11.23. Отображение информации о родителе и владельце
Рис. 11.24. Рамки TPanel и TBevel
Если добавите компонент TBevel на форму после всех необходимых компонент, TBevel будет иметь более высокое значение Z-порядка, поэтому доступ к компонентам, находящимся "под" ним, невозможным. Чтобы получить доступ к компонентам, находящимся "под" компонентом TBevel, щелкните правой кнопкой мыши на компоненте TBevel и в контекстном меню выберите команду Control^>Send То Back (Управление^Отправить назад).

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

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

Использовать свойство Align удобно при работе с контейнерными элементами управления, которые необходимо растягивать от одной стороны родительского элемента управления в другую. Однако, некоторые элементы управления, например TButton, TCheckBox и им подобные, не имеют свойства Align. Для выравнивания этих элементов управления должно применяться свойство Anchors.

Свойство Anchors представляет набор из четырех значений, которые определяют, каким образом элемент управления закрепляется в родительском элементе управления.

Значением свойства Anchors по умолчанию является [akLeft, akTop). Элементы управления, в которых свойство Anchors имеет это значение, не изменяют своего местоположения или размеров во время выполнения. Например, свойство Anchors можно использовать в тех случаях, когда кнопка должна быть всегда закреплена в правой части формы. Чтобы кнопка оставалась там даже при изменении размеров формы, свойству Anchors кнопки необходимо присвоить значение [akTop, akRight], как показано на рис. 11.25. Чтобы изменить значения свойства, щелкните на значке + слева от свойства, чтобы развернуть список его значений, и выберите значения, которые вам необходимы.

Рис. 11.25. Свойство Anchors

dle

Помоги проекту! Расскажи друзьям об этом сайте: