Реферат: Программирование на Delphi
С точки зрения языка, событие - это поле процедурного типа, предназначенное для создания пользовательской реакции на те или иные входные воздействия:
Property OnMyEvent: tMyEvent read FMyEvent write FMyEvent;
Здесь OnMyEvent - поле объекта, содержащее адрес некоторого метода. Присвоить такому свойству значение - значит указать программе адрес метода, который будет вызываться в момент наступления события. Такие методы называются обработчиками событий.
Внутри библиотеки времени выполнения Delphi вызовы обработчиков событий находятся внутри методов, обрабатывающих сообщения Windows. Выполнив необходимые действия, этот метод проверяет, известен ли адрес обработчика, и, если это так, вызывает его.
События имеют разное количество и тип параметров, в зависимости от происхождения и назначения. Общим для всех события является параметр Sender - он указывает на объект, вызвавший событие. Самое простое событие - tNotifyEvent - не имеет других параметров.
tNotifyEvent = procedure(Sender:tObject) of object;
Тип метода, предназначенный для извещения о нажатии клавиши, предусматривает передачу в процедуру кода этой клавиши, о передвижении мыши - ее текущих координат и т.д.
Имя события в Delphi начинается с префикса On: OnClick, OnCreate, OnMouseDown и т.д. Имена методов - обработчиков событий состоят из имени объекта, генерирующего событие, и корня имени события: OkButtonClick. Дважды щелкнув мышью в инспекторе объектов на странице Events в поле напротив любого события, вы получите скелетный код (заготовку) этого события.
Поскольку события - это свойства объекта, их значения можно менять в любой момент во время выполнения программы. Эта возможность называется делегированием. Можно в любой момент взять способы реакции на события у одного объекта и присвоить (делегировать) их другому.
Принцип делегирования позволяет избежать трудоемкого процесса порождения новых классов для каждого специфического случая, заменяя нго простой подстановкой процедур.
Один и тот же обработчик может обрабатывать события от разных объектов. Типичный пример - в современных программах одно и то же действие можно вызвать несколькими способами - через главное меню, контекстное меню и т. д. Этого легко добиться, назначив один и тот же обработчик всем необходимым объектам в инспекторе объектов. азумеется, события должны быть одного и того же типа.
Более сложный случай - когда внутри обработчика необходимо определить, какой именно объект вызвал событие. Если объекты, которые потенциально могут это сделать, имеют разный тип, то именно их тип можно применить в качестве критерия:
If Sender is tMenuItem then ...
Если же все объекты, разделяющее между собой один обработчик события, относятся к одному классу, можно использовать свойство tObject.Tag.
Ниже приведены названия некоторых, наиболее употребительных событий Delphi:
Событие - Тип обработчика - Когда возникает
OnClick - TNotifyEvent - При нажатии левой клавиши мыши
OnActivate - TnotifyEvent - После передачи объекту фокуса
OnCreate - TnotifyEvent - После создание объекта
OnDestroy - TnotifyEvent - Перед уничтожением объекта
OnDeactivate - TnotifyEvent - Перед уходом фокуса из объекта
OnKeyPress - TkeyPressEvent - При нажатии клавиши
OnMouseDown - TmouseEvent - При нажатии клавиши мыши
OnMouseMove - TmouseMoveEvent - При движении мыши над объектом
OnMouseUp - TmouseEvent - При отпускании клавиши мыши
а также их типы:
Тип
Описание
TnotifyEvent
type TnotifyEvent = procedure (Sender: TObject) of object;
TkeyPressEvent
type TkeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
TmouseEvent
TmouseEvent = procedure (Sender: TObject; Button: TmouseButton; Shift: TShiftState; X, Y: Integer) of object;
TmouseMoveEvent
TmouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
Стандартные события описаны в модуле Classes.
Динамические массивы
В Delphi существуют динамические массивы, то есть массивы, длину которых можно изменять во время выполнения программы. аньше проблема динамических массивов стояла довольно остро. Стандартных средств для работы с ними не было, и программистам приходилось вручную создавать подобные структуры (как правило, на основе динамических переменных). Теперь компилятор Delphi сам выполняет всю “грязную” работу. Параллельно с динамическими, в Delphi сохранились и обычные, статические массивы.
Длина динамических массивов определяется уже во время выполн