Begin
FFilm.Destroy; // Для полей-ссылок win FFilm.Free;
FTitle:="; // Для обычных полей
Inherited Destroy; // Можно вызвать и наследуемый TObject.Destroy
End;
Примечания:
• Реализация деструктора начинается с указания зарезервированного
слова Destructor, за которым следует полное имя деструктора:
<имя класса>.<имя деструктора>.
• Внутри деструктора есть доступ не только к обычным идентификаторам, но и к полям экземпляра класса, инкапсулированным при его определении.
• Исполняемые операторы деструктора должны позаботиться обо всех операциях очистки, необходимых для уничтожения экземпляра класса. Код деструктора должен уничтожить все внутренние экземпляры объектов и освободить динамическую память, которая была зарезервирована во время существования экземпляра класса. Однако нет необходимости явно устанавливать в нулевые значения поля прямого доступа.
• Следует иметь в виду, что при неудачных попытках создания экземпляров класса деструктор, особенно Destroy, используемый по умолчанию, может быть вызван лишь с частично инициализированным экземпляром, поэтому он должен быть подготовлен к работе с полями, которые еще не
инициализированы.
• Необходимость в объявлении деструкторов с параметрами возникает очень редко. Обычно все, что нужно сделать деструктору - уничтожить экземпляр класса, и вся необходимая для этого информация и так доступна ему.
• Если у класса нет полей косвенного доступа, то деструктор можно не создавать для такого пользовательского класса.
• Фактически нет не наследуемых конструкторов и деструкторов.
е) Вызов конструкторов.
Для того чтобы вызвать конструктор, необходимо правильно объявить и определить класс. Объявление класса должно быть доступно, т.е. он должен находится в области видимости из того места, где конструктор будет вызываться.
Если в пользовательском классе не определен конструктор, то по умолчанию будет использоваться конструктор, унаследованный от класса-потомка. В любом случае у всех объектов есть доступ к конструктору Create, определенному в классе TObject.
Определение класса создает активную структуру, способную создавать представителей этого класса. Объекты, которые создаются с помощью определения класса, способны хранить ссылки на вновь создаваемые объекты.
Синтаксис объявления переменной и вызова конструктора следующий:
Var <имя обьекта>: <имя класса>; // Объявление переменной -указателя
Begin
...
<имя обьекта>:=<имя класса>.<имя конструктора>[(<параметры>)];
...
End;
Var TmpFrm: TForm;
Begin
TmpFrm:=TForm.Create(Self); // Вызов метода с описателем - через точку
End;
Примечание:
• Если вызвать конструктор от имени объекта, то новый объект не будет создан (память не выделяется), но будут выполнены операторы, указанные в коде конструктора.
• Конструктор может также вызываться с помощью переменной типа указателя на класс.
ж) Вызов деструкторов
Деструкторы вызываются точно так же, как и большинство других методов класса - через его действующий экземпляр. Синтаксис вызова конструктора следующий:
<имя объекта>.<имя деструктора>[(<параметры>)];
Примечания:
• После вызова деструктора объект становится недоступен и единственная возможная операция, которую можно выполнить - это вызвать конструктор для создания нового экземпляра. Целесообразно присваивать объекту значение Nil сразу после его уничтожения, чтобы в дальнейшем можно было бы проверить его существование.
• Не следует вызывать деструкторы непосредственно. Вызов метода Free, наследуемого от TObject.Free, сравнивает указатель экземпляра со значением Nil перед тем, как вызвать деструктор Destroy.
з) Вызовы конструкторов и деструкторов компонентов Delphi. Любой компонент, попавший в ваше приложение при визуальном проектировании, включается в определенную иерархию объектов, которая замыкается на форме (класс TFonn). Поэтому вызов конструкторов и деструкторов всех компонентов формы производится автоматически при инициализации и удалении формы, незримо для программиста. Сами формы создаются и уничтожаются приложением - глобальным объектом с именем Application. В файле-проекте с расширением *.Dpr можно увидеть вызов конструктора формы в виде строки: