3 Родительские и дочерние компоненты
Класс TControl со своими наследниками образуют всю палитру видимых компонентов Delphi. Терминологически они называются элементами управления, так как на их основе прежде всего реализуются управляющие элементы Windows - кнопки, переключатели, списки и т. п.
Как уже отмечалось, некоторые из наследников TControl обладают дескрипторами окон и способны получать и обрабатывать Windows - сообщения, другие окон не имеют, но обязательно включаются в состав оконных компонентов, которые управляют ими, согласуясь с требованиями (сообщениями) Windows. Оконные элементы управления обладают специальной оконной функцией, в которую Windows посылает управляющие сообщения (например, извещения о манипуляции пользователя с мышью или о нажатии клавиш клавиатуры). В терминологии Windows такие элементы называются родительскими, а связанные с ними неоконные элементы - дочерними. Оконный компонент может выступать как родительский не только по отношению к неоконным компонентам, но и к оконным. В этом случае он просто транслирует управляющие сообщения Windows в оконные функции дочерних компонентов. Обязательным требованием Windows является визуальная синхронизация дочерних элементов: они не могут выходить из границ своего родителя и появляются и исчезают вместе с ним. Иными словами, родитель с дочерними элементами рассматривается Windows как единое целое.
Класс TControl имеет свойство Parent, которое содержит ссылку на родительский компонент:
property Parent: TWinControl;
Это свойство не следует путать с собственником Owner: Owner создал компонент (не обязательно - видимый), a Parent управляет видимым компонентом. Поскольку конструктор TComponent.Create не изменяет свойства Parent (в родительском классе TComponent такого свойства нет), при создании видимых компонентов во время выполнения программы это свойство необходимо изменять программно. Например, Следующий обработчик события OnCreate формы Form1 вставит дочерний элемент – метку в левый верхний угол формы:
procedure TForml.FormCreate(Sender: TObject);
var
IbLabel: TLabel;
begin
IbLabel := TLabel.Create(Self);
IbLabel.Parent := Self;
IbLabel.Caption := 'Дочерний элемент';
end;
Если убрать оператор
IbLabel.Parent := Self;
метка не будет знать, в каком именно окне она должна рисоваться и в какой момент, и ее текст не будет виден. Наоборот, изменение свойства Parent подключает метку к списку дочерних элементов формы, и оконная функция формы обратится к нужному методу метки, чтобы заставить ее появиться на экране в момент появления самой формы.
Помимо свойства Components каждый компонент -наследник TWinControl получает от своего предка свойство
property Controls[Index: Integer]: TControl;
содержащее список дочерних элементов – компонентов принадлежащих классу TControl. Свойство
property ControlCount: Integer;
возвращает количество дочерних элементов (длину массива Controls). Работать со списком Controls можно с помощью следующих методов:
function ContainsControl( Control: TControl): Boolean; |
Возвращает True, если компонент Control является дочерним элементом |
function ControlAtPos(const Pos: TPoint; AllowDisabled: Boolean): TControl |
Возвращает ссылку на компонент, которому принадлежит точка с координатами pos. Если AllowDisabled=True, поиск ведется также среди запрещенных для выбора компонентов |
function FindNextControl ( CurControl: TWinControl; GoFor-ward, CheckTabStop, CheckParent: Boolean): TWinControl; |
Ищет новый элемент в списке Controls. CurControi определяет начальную позицию поиска; GoForward=True, если поиск идет от начальной позиции к концу списка; CheckTab-stop=True, если поиск идет только среди компонентов со свойством TabStop=True; если CheckParent=True, поиск идет только среди оконных элементов
|
procedure GetTabOrderList(List:TList); |
Создает список List всех дочерних компонентов в порядке их выбора клавишей Tab
|
procedure InsertControl(AControl: TControl);
|
Вставляет новый дочерний элемент в список Controls. Программа не должна обращаться непосредственно к этому методу: для вставки дочернего элемента следует установить нужное значение свойства Parent во вставляемом компоненте |
procedure NotifyControls(Msg: Word);
|
Посылает сообщение Msg во все дочерние оконные компоненты |
procedure PaintControls(DC: HOC; First: TControl);
|
Перерисовывает все дочерние компоненты начиная с компонента First. Каждый дочерний компонент получает дескриптор графического устройства DC, с помощью которого он сможет прорисовать себя |
procedure Realign;
|
Перерисовывает все компоненты со свойством Align не равным noAlign. Вызывается после изменения размеров родительского компонента.
|
procedure Repaint;
|
Перерисовывает родительский компонент и все его дочерние компоненты |
procedure ScaleControls(M, D: Integer);
|
Перерисовывает все дочерние элементы с размерами, измененными в M/D раз по сравнению с предыдущими размерами |
procedure SelectFirst;
|
Выбирает первый в порядке обхода клавишей Tab дочерний компонент |
procedure Se- lectNext(CurControl: TWinControl; GoForward, CheckTabStop: Boolean);
|
Выбирает очередной в порядке обхода клавишей Tab дочерний компонент. CurControl определяет начальную точку поиска; GoForward= True, если поиск идет к концу списка; CheckTabStop=True, если выбираются только компоненты со свойством Tabstop=True |
procedure SetChildOrder(Child: TComponent; Order: Integer); |
Устанавливает новый порядок выбора клавишей Tab компонента child |
procedure ShowControl(AControl: TControl) ;
|
Показывает дочерний компонент AControl
|
В некоторых случаях бывает необходимо послать сообщение в собственную оконную функцию, чтобы заставить компонент выполнить действия, не предусмотренные набором его свойств и методов. Для посылки сообщения служит метод
function Perform(Msg, WParam: Word; LParam: Longlnt): Longlnt;
Параметры обращения к методу соответствуют параметрам вызова оконной функции: Msg - код сообщения; wparam, LParam - уточняющие параметры.