Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Общие принципы устройства и работы компонентов >> Класс TComponent
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Класс TComponent


Предком для всех компонентов библиотеки является класс TComponent. Он содержит несколько свойств и методов, общих для всех потомков. В первую очередь, каждый компонент обладает собственным именем. Под этим именем он находится в списке Инспектора объектов и других составных частей среды Delphi:

(Pb) property Name: TComponentName;

TComponentName = string[63];

Имя компонента не может быть пустой строкой; в модуле не может быть и двух компонентов с одинаковыми именами. Обратите внимание на то, что это не просто то имя, которое использует программист при обращении к свойствам и методам компонента, а компилятор ? при компиляции этих обращений. Компонент знает свое имя на этапе выполнения программы, но что еще более важно ? на этапе визуального проектирования приложения (будем называть его еще этапом разработки).

В каждом компоненте опубликовано также свойство

(Pb) property Tag: Longint;

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

Все компоненты в программе взаимосвязаны: каждый компонент имеет владельца и сам может быть владельцем других компонентов, которые сведены в список. Указатель на владельца есть свойство:

property Owner: TComponent;

Положение объекта в списке его владельца можно узнать и изменить, пользуясь свойством:

property ComponentIndex: Integer;

В конструкторе каждому компоненту передается указатель на Owner; это означает, что компонент будет находиться в списке этого владельца.

Какой смысл в создании такого списка?

Те, кто писал программы с использованием OWL, помнят, что у объектов этой библиотеки были конструкторы с большим количеством параметров; иногда конструкторов; было несколько.

У компонента же определение конструктора на удивление лаконично, но в нем присутствует указатель на Owner:

constructor Create(AOwner: TComponent);

Ответ прост: Owner ? тот объект, который при создании вызывает конструкторы всех объектов, владельцем которых он является, а при уничтожении ? их деструкторы. Таким образом, поместив при разработке компонент на форму, вы можете не заботиться о его создании и уничтожении в программе. Все свойства таких компонентов и все связи между ними запоминаются в файле формы .DFM и при запуске приложения создаются вновь автоматически.

Деструктор компонента

destructor Destroy;

уничтожает все дочерние компоненты (вызывая их деструкторы) и вычеркивает себя из списка компонента-владельца.

Конструкторы нужно вызывать только для тех компонентов, которые создаются вами во время исполнения. При этом они получат владельца и явный вызов деструктора не понадобится. Практически все конструкторы и деструкторы описанных ниже компонентов имеют тот же вид, что приводится здесь. Поэтому в дальнейшем их описания опущены, где это возможно.

Принадлежащие компоненты оформлены в виде списка, доступного через свойство Components. В классе TComponent предусмотрен набор методов и свойств для управления этим списком:

property Components[Index: Integer]: TComponent; Возвращает указатель на компонент с индексом в списке Index.
property ComponentCount: Integer; Возвращает число компонентов в списке.
function FindComponent(const AName: string): TComponent; Возвращает ссылку на компонент-потомок с заданным именем.
procedure InsertComponent (Acomponent: TComponent); Вставляет компонент в конец списка.
procedure RemoveComponent (Acomponent: TComponent); Удаляет компонент из списка.
procedure DestroyComponents; Удаляет все компоненты из списка.

Изменять владельца компонента во время исполнения можно, но без особой необходимости не нужно. Дело в том, что используемый для этого метод RemoveComponent не только вычеркивает компонент из списка, но и обнуляет указатель на него в соответствующем поле владельца. Например, если во время визуального проектирования вы поместили на форму кнопку Button1, а затем во время выполнения изменили ее владельца, то все обращения к ней в программе как к Button1 стали недействительны.

Рассмотрим другие свойства компонента. Он может находиться в одном из множества следующих состояний:

property ComponentState: TComponentState;

TComponentState = set of (csLoading, csReading, csWriting, csDestroying, csDesigning);

Эти состояния используются средой во время визуального проектирования, при загрузке/выгрузке компонентов из файлов ресурсов. Во время исполнения приложения множество состояний пусто. Лишь метод

procedure Destroying;

устанавливает в состоянии компонента флаг csDestroying и вызывает аналогичный метод у всех потомков из списка.

Он также используется в деструкторе компонента.

Свойство DesignInfo относится к стадии разработки (конструирования) приложения:

property DesignInfo: Longint;

В нем хранятся координаты верхнего левого угла компонента во время разработки



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017