Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++Builder.doc
Скачиваний:
7
Добавлен:
01.04.2025
Размер:
15.66 Mб
Скачать

6.2.5.1 Право владения

Л юбая компонента может находиться во владении (ownership) других компонент, но не все компоненты могут являться владельцами. Свойство компоненты

Owner (Владелец) содержит ссылку на компоненту, которая ею владеет. Рис. 6.2 показывает иерархию владения некоторой формы.

Рис. 6.2. Пример иерархии владения.

Владелец ответствен за освобождение тех компонент, которыми владеет, когда сам разрушается. Так в процессе конструирования формы, она автоматически становится владельцем всех компонент, размещенных на ней, даже если часть их размещена на другой компоненте, такой как TPanel. Владение применимо не только к видимым, но и к невидимым (Ttimer, DataSource) компонентам.

Когда компонента создается динамически в процессе выполнения программы, конструктору компоненты передается ее владелец в качестве параметра. В следующем примере неявный владелец формы (this) передается конструктору компоненты TButton как параметр. TButton выполнит присваивание значения переданного параметра свойству Owner кнопки MyButton:

MyButton = new TButton(this);

Когда форма, владеющая компонентой TButton освобождается, автоматически уничтожается и кнопка MyButton.

Вы можете создать компоненту, у которой нет владельца, передавая значение параметра 0 конструктору компоненты. Однако, когда эта компонента перестает быть нужной, ее уничтожение выполняется принудительно (с помощью оператора delete). Следующий пример иллюстрирует обращение с компонентой TTable, не имеющей владельца:

TTable* MyTable = new TTable(0)

// Код, реализующий работу с MyTable

delete MyTable;

Свойство Components типа массив содержит перечень компонент, которыми владеет данная компонента. Листинг 6.1 содержит фрагмент кода обработчика события OnClick с циклом отображения имен классов всех компонент, которыми владеет некоторая форма.

void _fastcall TFormI::ButtonlClick(TObject *Sender) {

for (int i=0; i<ComponentCount; i++)

ShowMessage(Components[i]->ClassName()) ;

}

Листинг 6.1. Использование свойства Components.

6.2.5.2 Родительское право

Понятие родительского права (parentship) существенно отличается от права владения и применимо только к видимым (оконным) компонентам.Родитель компоненты не может быть ее владельцем.

Р одительские компоненты обращаются к соответствующим внутренним функциям, чтобы вызвать отображение компонент-потомков. Родитель также ответствен за освобождение своих потомков, когда сам родитель уничтожается. Свойство компоненты Parent (Родитель) содержит ссылку на компоненту, которая является ее родителем. Рис. 6.3 показывает родительскую иерархию некоторой формы.

Рис. 6.3. Пример родительской иерархии.

Многие свойства видимых компонент (например. Left, Width, Top, Height) относятся к родительским элементам управления. Другие свойства (например, ParentColor и ParentFont) позволяют потомкам использовать свойства родителей.

К оконным компонентам относятся такие видимые элементы, как TEdit, TListBox и TMemo. Чтобы отобразить оконную компоненту, ей надо присвоить родителя, ответственного за отображение. Это присваивание выполняется автоматически на стадии проектирования, когда вы перетаскиваете нужную компоненту из Палитры компонент на форму. Напротив, при создании компоненты во время выполнения программы вы должны явно записать это присваивание, иначе компонента не будет отображена (Листинг 6.2).

void _fastcall TFormI::FormCreate(TObject *Sender)

{

MyEdit = new TEdit(this); // Передать this как владельца MyEdit->Parent = this; // Передать this как родителя

}

Листинг 6.2. Создание компоненты TEdit во время выполнения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]