Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Отслеживание разрушения объектов

Проследим за разрушением объектов на форме. Очевидно, это можно увидеть в секциях initialization и finalization, т.е. после того, как форма начнет разрушаться.

initialization

MessageBox(0,PChar(Format('На форме %d кнопок',

[TMyButton.GetCount])),'Инициализация',mb_ok);

finalization

MessageBox(0,PChar(Format('На форме %d кнопок',

[TMyButton.GetCount])),'Финиш',mb_ok);

В данном случае использовалась функция Windows API MessageBox, так как при разрушении формы доступ в секции finalization ко многим функциям Delphi невозможен. Запуская данную программу на выполнение, получим два сообщения до построения и после разрушения формы.

События

В приложениях и компонентах событие возникает как результат послания операционной системой сообщения, что произошло некоторое действие, которое контролирует метод послания уведомления о событии. Этот метод проверяет, назначил ли пользователь соответствующий обработчик событий. Если событие произошло и обработчик назначен, то метод послания уведомления о событии вызывает соответствующий обработчик. Методы послания уведомления о событии можно переопределять, используя стандартные методы, или создавать свои собственные.

Рассмотрим вариант переопределения методов послания уведомления о событии. Такие методы реализуются в разделе Protected. Поэтому потомки тех встроенных классов, в которых реализуются такие методы, могут делать доступными их для пользователя. Например, рассмотрим, как переопределяется метод послания уведомления о событии Click для кнопки, одновременно изменяя её заголовок строку с текущим временем.

TtimeButton=class(Tbutton)

Protected

Procedure Click; override;

End;

. . . .

Procedure TtimeButton.Click;

Inherited Click;

Caption:=DateTimeToStr(Now);

End;

Методы послания уведомления о событии являются указателями на метод, которые вызываются в случае, когда компонент получает сообщение от Windows о том, что произошло некоторое событие, воздействующее на данный компонент. Обработчики событий представляют собой свойства, которые выполняют чтение и запись в указатели на метод. Например, рассмотрим фрагмент, взятый из класса TControl, содержащегося в исходном коде VCL. Имена обработчиков событий по соглашению содержат префикс On. Вначале объявляется событие:

TNotifyEvent=procedure(Sender:TObject) of object;

Далее объявляется класс, содержащий поля данного типа и обработчики событий, работающие с этими полями.

Tcontrol=class(TComponent)

Private

FOnClick: TNotifyEvent;

. .

Ptotected

Property OnClick: TnotifyEvent read FonClick

write FOnClick;

. . .

end;

При создании собственных обработчиков необходимо научиться строить методы посылки уведомления о событии. Эти методы должны уметь получать и обрабатывать сообщения Windows, что возможно сделать с помощью методов вида Message.

Указатели на методы

Этот тип данных представляет собой ссылку (указатель) на метод. Указатель на метод содержит два адреса: одна ссылка на адрес кода метода, другая – на адрес экземпляра объекта – представляет собой скрытый параметр self. Адрес self представляет собой в данном случае адрес расположения данных, принадлежащих конкретному объекту.

Указатели на методы реализуют один из принципов компонентной технологии – делегирование. Если кто-то написал класс, у которого есть поля в виде указателей на методы, например,

Type

TNotifyEvent=procedure(Sender:Tobject) of object;

TMyButton=class

OnClick: TNotifyEvent;

End;,

то можно менять поведение построенных (даже скомпилированных) этого типа объектов, просто присваивая этим указателям новые методы. Например,

Type

TForm1=class(TForm)

Procedure OnButton1Click(Sender:Tobject);

Button1:MyButton;

End;

Теперь при построении компонента на форме можно делегировать обработчик OnButton1Click из TForm1 в MyButton путем следующего присваивания:

MyButton.OnClick:=Form1.OnButton1Click;