Главная » Delphi » Конструкторы и деструкторы

0

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

Переопределение конструкторов

Объявляя  собственный  конструктор  для  потомка  класса  TComponent,  всегда  ис

пользуйте директиву override, как показано ниже.

TSomeComopnent = class(TComponent)

private

{ Закрытые объявления }

protected

{ Защищенные объявления }

public

constructor Create(AOwner: TComponent); override;

published

{ Публикуемые объявления }

end;

НА ЗАМЕТКУ

На уровне класса TComponent конструктор Create() является виртуальным. Неком- понентные классы имеют статические конструкторы, которые вызываются конструкто- рами классов TComponent. Следовательно, при создании некомпонентного производ- ного класса, конструктор не может быть переопределен, поскольку он не является вир- туальным:

TMyObject = class(TPersistant)

В этом случае достаточно просто переобъявить конструктор.Несмотря на то что  с точки  зрения синтаксиса директива override необязатель на,  ее  отсутствие может  вызвать проблемы при  использовании компонента. Дело  в том,  что  в процессе использования компонента (как  во время  разработки, так  и во время  выполнения) невиртуальный конструктор не будет вызван  кодом,  создающим этот компонент по ссылке на класс (например в потоковой системе).

Не забудьте также удостовериться, что в коде конструктора вызывается унаследо

ванный конструктор:

constructor TSomeComponent.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

// Поместите ваш код здесь

end;

Поведение компонента во время разработки

Помните, что  при  создании компонента всегда  вызывается его  конструктор. Это относится и к созданию компонента во время  разработки (при  помещении его в фор му). Кстати, можно  потребовать отмены выполнения некоторых действий, когда компонент находится в состоянии разработки. Например, в конструкторе компонен та  TddgHalfMinute создается компонент TTimer. В общем то  ничего страшного в этом нет, но существует возможность добиться того,  чтобы  TTimer вызывался только во время  выполнения.

Для определения текущего  состояния компонента следует проверить его свойство ComponentState. В табл. 11.3  приведены данные  о  возможных состояниях компо нента, взятые из интерактивной справочной системы Delphi  6.

Таблица 11.3. Значения состояния компонента

Флаг                                        Состояние компонента

csAncestor         Устанавливается, если компонент используется в форме предке.

Это значение устанавливается только  при  установленном флаге

csDesigning

csDesigning   Режим   разработки,  т.е.  компонент  находится  в  форме  в  окне конструктора форм

csDestroying       Объект в процессе удаления

csFixups      Установлен, если данный компонент связан  с компонентом дру гой формы, которая еще не загружена. Флаг сбрасывается, когда все подобные связи установлены

csLoading          Загрузка  из объекта файловой системы

csReading          Считывание значений свойств  из потока

csUpdating    Компонент обновляется, чтобы  отобразить изменения, внесен ные  в форму предок. Устанавливается только   при  установлен ном флаге csAncestor

csWriting Запись свойств  компонента в потокСостояние csDesigning чаще  всего  используется для проверки того,  находится ли компонент в режиме разработки. Это можно  сделать  с помощью следующих опера торов:

inherited Create(AOwner);

if csDesigning in ComponentState then

{ Выполнение необходимых действий }

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

Переопределение деструкторов

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

destructor TMyComponent.Destroy;

begin

FTimer.Free;

MyStrings.Free;

inherited Destroy;

end;

CОВЕТ

Вот простое, но удобное правило: в переопределенном конструкторе первым вызывается унаследованный конструктор, а в переопределенном деструкторе, наоборот, унаследован- ный деструктор вызывается последним. Соблюдение этого правила гарантирует, что класс будет корректно настроен перед его модификацией и все связанные с ним ресурсы будут освобождены перед завершением работы с этим классом.

Из данного правила есть исключения, но с ними вряд ли придется встретиться на практике.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии