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

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) и другие.