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

Var TmpFrm: tForm;

Begin

TmpFrm:=TForm.Create(Self); // Вызов метода с описателем - через точку

End;

Примечание:

Если вызвать конструктор от имени объекта, то новый объект не будет создан (память не выделяется), но будут выполнены операторы, ука­занные в коде конструктора.

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

ж) Вызов деструкторов

Деструкторы вызываются точно так же, как и большинство других мето­дов класса - через его действующий экземпляр. Синтаксис вызова конструк­тора следующий:

<имя объекта>.<имя деструктора>[(<параметры>)];

Примечания:

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

Не следует вызывать деструкторы непосредственно. Вызов метода Free, наследуемого от TObject.Free, сравнивает указатель экземпляра со значением Nil перед тем, как вызвать деструктор Destroy.

з) Вызовы конструкторов и деструкторов компонентов Delphi. Любой компонент, попавший в ваше приложение при визуальном проек­тировании, включается в определенную иерархию объектов, которая замыка­ется на форме (класс TFonn). Поэтому вызов конструкторов и деструкторов всех компонентов формы производится автоматически при инициализации и удалении формы, незримо для программиста. Сами формы создаются и унич­тожаются приложением - глобальным объектом с именем Application. В фай­ле-проекте с расширением *.Dpr можно увидеть вызов конструктора формы в виде строки:

Application.CreateForm(TForml, Fonnl);

и) Динамическое создание объектов. Пользователь может создать объект и программным путем:

Var Mem: tMemo;

Begin

Mem:=TMemo.Create(Self); // Создание экземпляра класса TMemo

Mem.Parent:=Self; // Form1 указывать не обязательно

Mem.Name:='TmpMem'; // Присвоение имени компоненту

FindComponent('TmpMem').Free; // Удаление компонента

2.3. Классовые процедуры и функции

Наиболее важное отличие классовых методов от обычных заключается в том, что при их вызове не требуется экземпляр класса, вследствие чего не­возможно и обращение к его полям. Классовые методы - это обычные под­программы.

а) Синтаксис объявления классовых методов:

Type <имя клacca>=Class[(<имя родительского класса>)]

. . .

Class Procedure <имя процедуры>[(<параметры>)};

Class Function <имя функции>[(<параметры>)]:<тип результата>

. . .

End;

Примечания:

В классе может быть объявлено несколько классовых методов.

Каждое объявление классового метода должно начинаться с зарезер­вированного слова Class, за которым следует объявление процедуры или функций по обычным правилам.

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

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

Классовые методы могут быть виртуальными, при этом их можно переопределять и использовать полиморфизм.

Одно из назначений классовых методов заключается в возможности извлечения данных о классе из структуры RTTI. Важнейшие из них определе­ны в самом классе TObject: имя класса (ClassName), размер экземпляра (InstanceSize), адреса (MethodAddress) и имена методов (MethodName), ука­затель на класс-предок (ClassParent) и указатель (Classlnfo) на структуру PTypelnfo, позволяющую извлекать всю информацию о классе из структуры (RTTI) и другие.