Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_N5_.doc
Скачиваний:
3
Добавлен:
24.04.2019
Размер:
126.46 Кб
Скачать

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: TWinCon­trol; 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 - уточняющие параметры.