Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в среде Delphy / Программирование в среде Delphi.doc
Скачиваний:
189
Добавлен:
01.05.2014
Размер:
1.3 Mб
Скачать

17.5. События (Events)

События в Delphi – это свойства процедурного типа, предназначенные для создания пользовательской реакции на те или иные входные воздействия. Пример объявления события:

Property OnMyEvent:TmyEvent Read FOnMyEvent

Write FonMyEvent;

Присвоить такому свойству значение – это значит указать адрес метода, который будет вызываться в момент наступления события. Такие методы называются обработчиками событий. События имеют разные типы, но общим для всех является параметр Sender – указатель на объект – источник события. Самый простой тип события это тип

TnotifyEvent=procedure(Sender:Tobject) of Object;

Здесь «of Object» означает, что данный тип определяет именно метод, а не обычную процедуру. Приставка On в имени свойства означает, что данное свойство является событием, хотя не каждое событие может иметь такую приставку. Для определения события необходимо в разделе Private объявить поле указателя на метод. В разделе Protected нужно объявить методы чтения и записи адреса обработчика события в это поле. Затем в разделе Published объявить само событие, как свойство процедурного типа. В инспекторе объектов есть две страницы: страница свойств (Properties) и страница событий (Events). Двойной щелчок левой клавишей мыши по событию приводит к появлению обрамления обработчика события в тексте программного модуля Unit.

Общими для всех компонентов являются события (наследники класса TControl):

OnClick – нажатие левой клавиши мыши,

OnDblClick – двойной щелчок левой клавиши мыши,

OnMouseDown – нажатие любой клавиши мыши,

OnMouseMove – перемещение курсора мыши по компоненту,

OnMouseUp – отжатие кнопки мышки.

Общими для оконных элементов управления являются события (наследники класса TWinControl):

OnEnter – перемещение фокуса ввода на компонент, который становится активным,

OnExit – потеря активности компонентом,

OnKeyDown – нажатие клавиши или комбинации клавиш,

OnKeyPress – нажатие каждой одиночной клавиши,

On KeyUp – отпускание клавиши.

18. Выделение памяти под объект и прародитель всех классов – tobject

18.1. Выделение памяти под объект

Рассмотрим более детально – что собой представляет объект? Допустим, что мы определили класс следующим образом:

Type TMyClass=Class

F1:Integer;

F2:String[20];

Procedure Sm1;

Procedure Vm1;virtual;

Procedure Vm2;virtual;

` Procedure Dm1;dynamic;

Procedure Dm2;dynamic;

End;

В обработчике какого–то события в описании переменных определим указатель на объект класса TMyObject:

Var Obj1:TMyClass;

В разделе действий мы создадим экземпляр этого объекта как

Obj1:=TMyClass.Create;

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

Рис.18.1. Структура связи объекта с описаним класса

Первое поле каждого экземпляра объекта содержит указатель на его класс. Затем идут поля объекта в том порядке, как они описаны в классе, и всех наследуемых классах. Класс как структура состоит из двух частей. Указатель на класс определяет начало таблицы указателей на динамические методы класса. В эту таблицу включаются все наследуемые и вновь описанные в данном классе динамические методы. Перед таблицей динамических методов с отрицательным смещением располагается информация о классе, так называемая информация о типе времени выполнения (RunTime Type Information – RTTI). Описание этой информации можно найти в модуле System.pas (см. константы с приставкой vmt*). От версии к версии Delphi объем этой информации все возрастает и, например, для Delphi 6 составляет 76 байт. В этой области находятся 19 указателей на различные таблицы и параметры класса. Так, например, там есть указатели на классовые методы, которые можно вызывать, даже не выделяя объекту память, есть указатели на таблицы динамических методов, таблицу реализуемых интерфейсов (для совместимости с объектами COM) и т.д. Но к этой таблице напрямую нужно обращаться только в крайнем случае и имея большой опыт программирования на Delphi. Все основные параметры класса можно получать, используя методы прародителя всех классов класса TObject.