Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2 семестр.doc
Скачиваний:
42
Добавлен:
27.05.2015
Размер:
777.73 Кб
Скачать

2.2. События

Визуальные компоненты генерируют и обрабатывают достаточно большое число событий различных видов. Большинство событий носят нотификационный (уведомляющий) характер и принадлежат типу TNotifyEvent, описанному следующим образом:

type TNotifyEvent = procedure (Sender: TObject) of Оbject;

Нотификационные события содержат только источник события, на который указывает параметр Sender, и больше никакой информации не несут. Существуют и более сложные события, требующие передачи дополнительных параметров, например событие, связанное с перемещением указателя мыши, передает координаты указателя.

Событие OnClick типа TNotifyEvent возникает при выборе компонента. Событие OnClick одно из наиболее часто используемых.

Пример процедуры обработки события выбора элемента Edit1:

procedure TForm1.Edit1Click(Sender: TObject);

begin

Edit1.Color := Random($FFFFFF); { при щелчке мышью в поле Edit1 случайным образом изменяется цвет его фона}

end;

Для некоторых компонентов событие OnClick может возникать и при других способах нажатия на управляющий элемент, находящийся в фокусе ввода, например, для компонента Button – с помощью клавиши <Пробел> или <Enter>, а для компонента CheckBox – клавиши <Пробел>.

При щелчке любой кнопкой мыши генерируются еще два события: OnMouseDown типа TMouseEvent, возникающее при нажатии кнопки мыши, и OnMouseUp типа TMouseEvent, возникающее при отпускании кнопки.

Cобытие OnDblClick типа TNotifyEvent генерируется при двойном щелчке левой кнопкой мыши в области компонента. События возникают в следующем порядке: OnMouseDown, OnClick, OnMouseUp, OnDblClick, OnMouseDown, OnMouseUp.

Cобытие OnMouseMove типа TMouseMoveEvent непрерывно вырабатывается при перемещении указателя мыши над визуальным компонентом. Последний описан следующим образом:

type TMouseMoveEvent=procedure(Sender: TObject; Shift:TShiftState; Х,Y: Integer) of Оbject;

где параметр Sender указывает, над каким элементом управления находится указатель мыши, а параметры X и Y определяют координаты (позицию) указателя. Координаты указываются относительно элемента управления, определяемого параметром Sender. Параметр Shift указывает на состояние клавиш <Alt>, <Ctrl> и <Shift> клавиатуры и кнопок мыши:

ssShift – нажата клавиша <Shift>;

ssAlt – нажата клавиша <Alt>;

ssCtrl – нажата клавиша <Ctrl>;

ssLeft – нажата левая кнопка мыши;

ssMiddle – нажата средняя кнопка мыши;

ssDouble – выполнен двойной щелчок мышью.

При нажатии любой из указанных клавиш к параметру Shift добавляется соответствующее значение. Например, если нажата комбинация клавиш <Shift>+<Ctrl>, то значением параметра Shift является [ssShift, ssCtrl]. Если не нажата ни одна клавиша, то параметр Shift принимает пустое значение [].

Пример отображения координат указателя мыши:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Sender);

begin

Form1.Caption := 'Координаты указ. мыши: '+IntToStr(X)+' и '+IntToStr(Y);

end;

При перемещении указателя мыши в пределах формы его координаты отображаются в заголовке формы. Позиция указателя мыши отображается, если указатель находится в свободном месте формы, а не расположен над каким-либо управляющим элементом. Координаты X и Y отсчитываются в пикселях от левого верхнего угла формы, начиная с 0.

События OnKeyPress и OnKeyDown генерируются при нажатии клавиши, а событие OnKeyUp возникает при отпускании клавиши. При нажатии клавиши возникновение событий происходит в следующем порядке: OnKeyDown, OnKeyPress, OnKeyUp. Событие OnKeyDown непрерывно генерируется при удерживании клавиши нажатой, событие OnKeyUp возникает однократно после отпускания клавиши.

Событие ОnKeуРrеss типа ТKеуРrеssЕvеnt генерируется при каждом нажатии одной из алфавитно-цифровых клавиш. Описание типа TKeyPressEvent:

type TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;

Параметр Kеу содержит код ASCII нажатой клавиши, который может быть проанализирован и при необходимости изменен. Если параметру Key задать значение ноль (#0), то это соответствует отмене нажатия клавиши.

Обработчик события OnKeyPress не реагирует на нажатие управляющих клавиш, тем не менее, параметр Key содержит код символа с учетом регистра, который определяется состоянием клавиш <Caps Lock> и <Shift>.

Пример обработчика события OnKeyPress редактора

procedure TForm1.Edit1KeyPress(Sender: TObject; var Кеу: Char);

begin

if Кеу = '!' then Кеу := #0; // пользователю запрещен ввод символа ! в редактор Edit1

end;

Для обработки управляющих клавиш, не имеющих ASCII-кодов, можно программно использовать события OnKeyDown и OnKeyUp типа TKeyEvent, возникающие при нажатии на любую клавишу. Тип TKeyEvent описан как

type TKeyEvent = procedure (Sender: TObject; var Кеу: Word; Shift: TShiftState) of Оbject;

Указанные события часто используются для анализа состояния управляющих клавиш <Shift>, <Ctrl>, <Alt> и других. Состояние этих клавиш и кнопок мыши указывает параметр Shift, который может принимать ранее рассмотренные значения. В отличие от события OnKeyPress, параметр Key имеет тип Word, а не Char, поэтому для преобразования находящегося в Key кода клавиши в символ можно использовать функцию Chr () .

В обработчиках событий, связанных с нажатием клавиш, можно также обрабатывать комбинации управляющих и алфавитно-цифровых клавиш, например, <Alt>+<8>.

Пример обработки нажатий управляющих и алфавитно-цифровых клавиш:

procedure TForm1.Edit2KeyDown(Sender: TОbject; var Key: Word; Shift: TShiftState)

begin

if (Shift = [ssCtrl]) and (chr(Key) = ‘1’ ) then

MessageDlg('Нажaты клавиши <Ctrl> + <1> ', mtConfirmata,on, [mbOK], 0);

end;

При нахождении в фокусе ввода компонента Edit2 нажатие комбинации клавиш

<Ctrl>+<1> вызывает диалоговое окно Confirm с соответствующим сообщением.

Отдельные клавиши имеют особенности, например, при нажатии на клавишу <Таb> не возникают события OnKeyPress и OnKeyUp.

Windows виртуальным кодам клавиши соответствуют символьные константы с префиксом vk_.

Например, vk_alt - это виртуальный код клавиши <Alt>.

Событие OnEnter типа TNotifyEvent возникает при получении фокуса оконным элементом управления любым способом, например, щелчком мыши или с помощью клавиши <Таb>. В случае потери фокуса ввода оконным элементом управления возникает событие OnExit типа TNotifyEvent.

Пример обработки событий получения и потери фокуса элементом управления:

procedure TForm1.Edit1Enter(Sender: TObject);

begin

Label1.Caption := (Sender as TControl).Name + ' активен';

end;

procedure TForm1.Edit1Exit(Sender: TObject);

begin

Label1.Caption : =TEdit(Sender).Nаmе + ' не активен';

end;

В заголовке надписи Label1 отображается активность (наличие или отсутствие фокуса) компонента Edit1. Доступ к свойству Name параметра Sender в процедурах обработки выполнен двумя способами. В первом случае параметр Sender с помощью конструкции as неявно приводится к типу TControl. Во втором случае параметр Sender явно приводится к типу TEdit.

Cобытие OnHint типа TNotifyEvent возникает, если указатель некоторое время неподвижен в области компонента. Его можно использовать для написания обработчиков, связанных с выводом контекстной помощи.