Обучающий курс. 11. События в DelphiИсточник: delphi
События в программировании, как и события реального мира - это какие-либо операции, происходящие в установленное время. Установленное время - это не конкретное время с точки зрения часов, это просто отклики на какие-то другие действия и изменения. События присущи объектно-ориентированному программированию и являются одной из важных черт операционной системы Windows. Работа программ с визуальным (графическим) интерфейсом немыслима без событий. Delphi предоставляет полный доступ для работы с событиями и немного упрощает программирование обработчиков событий. Целью урока является знакомство с наиболее часто используемыми событиями, а также с приёмами написания обработчиков для них.
Пример обработки событий №1
procedure TForm1.Button1Click(Sender: TObject); Конечно, работать будет... Но настоящие программисты так не делают... Судите сами: а если бы было 100 кнопок - что тогда? 100 обработчиков? Конечно нет! Можно создать один обработчик сразу для всех кнопок. Выше было сказано, что это можно сделать, если выбрать в Инкспекторе Объектов обработчик события из списка... Но в случае, если 100 кнопок, такой способ тоже непригоден - уйдёт много времени. Есть ещё один: если выбрать на форме сразу несколько объектов, то в Инспекторе Объектов среди свойств и событий останутся только те, которые есть у всех выбранных объектов. Этим и следует воспользоваться. Итак, выбираем на форме все 3 кнопки (очерчивая область мышью, либо удерживая Shift), далее переходим на вкладку Events в ИО и создаём обработчик события OnClick. Что происходит: открывается редактор кода, но создаётся только один обработчик, хотя он присваивается всем трём кнопкам. Вывод сообщения также реализуется одной строкой, в которую подставляется имя кнопки, которая была нажата. procedure TForm1.Button1Click(Sender: TObject); Как именно это работает и что делает оператор as сейчас объяснить довольно сложно. Всему своё время. Пример создан с целью показать, что дублирования всегда можно каким-то способом избежать. Параметры, передаваемые обработчикамУ событий есть параметры. У многих событий параметр один, но у некоторых их бывает и больше - зависит от типа события. Из переданных параметров можно узнать дополнительные данные и условия, при которых произошло событие. Например, если мы знаем, что пользователь передвинул курсор мыши, это ещё ни о чём не говорит и полезной информации практически не несёт. А вот если мы знаем, что курсор был передвинут в точку экрана с некоторыми известными координатами (x;y) - это уже что-то. СобытияВот теперь, когда мы достаточно много знаем о событиях, можно наконец рассмотреть стандартные и наиболее часто используемые из них. OnClick - щелчок мышью по объекту. У кнопки событие также срабатывает, если нажать Enter или Пробел в тот момент, когда фокус ввода находится на кнопке. OnDblClick - двойной щелчок мышью. OnContextPopup - при вызове контекстного меню объекта, т.е. при щелчке правой кнопкой мыши. Среди параметров есть MousePos - координаты курсора в момент щелчка. Координата по X доступна как MousePos.X, а по Y - как MousePos.Y. OnEnter - момент, когда объект получает фокус ввода (фокус ввода обычно изображается пунктирной рамкой на объекте; в поле ввода - это курсор; фокус один на всё приложение, т.е. работать одновременно можно лишь с одним объектом). OnExit - момент, когда объект теряет фокус ввода. OnMouseDown - при нажатии кнопки мыши (не обязательно левой). Параметр Button - нажатая кнопка (mbLeft - левая кнопка, mbRight - правая, mbMiddle - средняя). Shift - множество, указывающее, какие функциональные клавиши были зажаты при щелчке. Таким образом можно отслеживать, например, нажатия при зажатых Ctrl+Alt и т.п. X, Y - координаты курсора во время нажатия (относительно левого верхнего угла самого компонента, а не формы!). OnMouseUp - событие, аналогичное OnMouseDown. Происходит при отпускании кнопки мыши. Пример комбинации этих двух событий - графический редактор: когда кнопка мыши нажата, происходит рисование, а когда отпущена - не происходит. OnMouseMove - ещё одно событие мыши, происходящее при перемещении курсора над объектом. X, Y - координаты нового положения, Shift - множество нажатых функциональных клавиш. OnKeyDown - при нажатии какой-либо клавиши клавиатуры в тот момент, когда фокус ввода находится на объекте. Key - код нажатой клавиши, Shift - всё то же множество функциональных клавиш (этот параметр встречается во многих событиях). OnKeyUp - при отпускании клавиши (антипод OnKeyDown). OnKeyPress - при нажатии клавиши, которая печатает какой-либо символ (буква, цифра, знак). Key - уже не код клавиши, а сам символ (тип данных: Char - один символ). OnResize - при изменении размеров объекта. OnPaint - при отрисовке объекта на экране (например, формы). У самой формы также есть множество событий. Отметим некоторые из них: OnCreate - при создании формы. Обычно в обработчик этого события помещают действия, которые должны произойти при запуске программы. Но при запуске это выполнится только если форма является главной в приложении и при условии, что форма создаётся автоматически. Если в приложении одна форма - она и является главной. OnClose - при закрытии формы.OnCloseQuery - при попытке закрыть форму. Это событие можно использовать, если нужно заблокировать закрытие формы. В обработчике присутствует параметр CanClose (англ. - "можно закрыть"): логическое значение, тип данных - Boolean. Если после выполнения обработчика значение переменной CanClose окажется False, то закрытие формы произведено не будет. Значение этой переменной устанавливается программно. Пример использования этого события - текстовый редактор. Если пользователь ввёл текст, но не сохранил его в файл, при выходе из программы нужно спросить, следует ли сохранить изменения. Пример обработки событий №2Цель: запретить "прямое" закрытие формы, а спрашивать, действительно ли пользователь хочет закрыть программу. Используем событие формы OnCloseQuery. В обработчике выведем диалоговое окно и, если пользователь ответит "Нет", заблокируем закрывание. Для вывода окна диалога воспользуемся функцией MessageDlg. Подробнее о ней и о её параметрах Вы узнаете в одном из следующих уроков. Наш обработчик: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
События (продолжение) OnDestroy - при уничтожении формы (после закрытия форма уничтожается и освобождается занятая ей память). OnShow - при показе формы на экран. OnHide - при скрытии формы с экрана. OnActivate - момент, когда форма становится активной, т.е. когда ей передаётся фокус ввода (например, когда пользователь щёлкнул по форме). OnDeactivate - соответственно, когда форма теряет фокус. OnChange - при изменении чего-либо (например, у поля ввода TEdit это событие срабатывает, когда изменяется текст в этом поле). OnDragDrop, OnDragOver, OnEndDock, OnEndDrag, OnStartDock, OnStartDrag - все эти события связаны с технологией Drag&Drop (т.е. когда объект "захватывается" мышью и переносится в другое место), а также с Dock-технологией. Суть этой (Dock) технологии во встраивании одних объектов в другие. Например, если взять Object Inspector за заголовок и переместить на нижнюю часть Object TreeView, а затем отпустить, то окна объединятся, а если переместить его в центр Object TreeView, то закладок станет 3 (Object TreeView станет третьей закладкой). Как видите, событий великое множество и описывать их все просто бессмысленно - их названия раскрывают смысл самих событий. Достаточно знать о том, какие события вообще существуют. ЗаключениеМы рассмотрели работу с событиями - одни из принципов объектно-ориентированного программирования. Таким образом, разработка визуальной программы для Windows сводится к написанию обработчиков на события, в которых описывается взаимодействие объектов друг с другом. |