События от клавиатуры и мыши

После того как мы познакомились с событиями, характерны­ми для формы, давайте посмотрим на события, которые могут получать практически все визуальные компоненты — события от клавиатуры и мыши. Изначально источником этих событий яв­ляется драйвер клавиатуры или драйвер мыши, затем ядро Win­dows преобразует их в стандартный вид и пересылает окну про­граммы. Прежде чем послать сообщение о вводе с клавиатуры, ядро Windows определяет, какое окно находится в фокусе, то есть какое окно является активным. В Delphi-программах активными элементами будут одна из форм (или главная форма) и элемент, определенный свойством ActiveControl.

Событие OnKeyPress

Возникает при нажатии клавиши на клавиатуре. Обычно это событие обрабатывается в том случае, когда необходима реак­ция на нажатие одной клавиши на клавиатуре. Параметр Key имеет тип Char и содержит ASCII-код нажатой клавиши. Для клавиш, которые не имеют ASCII-кодов (соответствующих сим­волов), таких как Shift или F1, событие OnKeyPress не возника­ет. При использовании комбинаций клавиш, например Shift+A, возникает только одно событие OnKeyPress. Так, при нажатии комбинации Shift+A параметр Key будет иметь значение «А» (зависит от состояния переключателя Caps Lock). Для обработ­ки нажатий клавиш, не имеющих ASCII-эквивалентов, и ком­бинаций клавиш необходимо использовать события OnKeyDown и OnKeyUp.

Событие OnKeyPress имеет тип TKeyPressEventи описано следующим образом:

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

Событие OnKeyDown

Происходит при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и со­стоянии клавиш Shift, Alt и Ctrl, а также о нажатой кнопке мыши. Информация о клавише передается параметром Key, который имеет тип Word. Для определения того, какая именно клавиша была нажата, необходимо использовать коды виртуальных кла­виш.

Ниже показано, как определить нажатие комбинации клавиш Alt+F10:

procedure TForm1.FormKeyDown(Sender: TObJect; var Key: Word; Shift:

TShiftState);

begin

if ((Shift = [ssAlt]) and (Key = VK.F1O)) then

MessageDlg(‘Alt+F10 pressed down’, mtlnformation, [mbOK], 0);

end;

Событие OnKeyDown имеет тип TKeyEvent,описанный сле­дующим образом:

TKeyEvent = procedure (Sender: TObject; var Key: Word; Shift: TShiftState) of object;

Параметр содержит код нажатой клавиши, а параметр Shift может иметь одно из следующих значений:

Значение Описание
ssShift Нажата клавиша Shift
ssAlt Нажата клавиша Alt
ssCtrl Нажата клавиша Ctrl
ssLeft Нажата левая кнопка мыши
ssMiddle Нажата средняя кнопка мыши
ssRight Нажата правая кнопка мыши
ss Double Нажаты правая и левая кнопки мыши


Обработка событий OnKeyUp и OnKeyDown

Чаше всего события OnKeyDown и OnKeyUp используются для определения нажатия комбинаций клавиш Shift, Ctrl или Alt при получении активным интерфейсным элементом сообщения о на-ясатии клавиши. Также эти события можно использовать для опре­деления момента нажатия клавиш, не имеющих ASCII-эквивален-хов, таких, например, как функциональные клавиши. Напомним: хакие клавиши не обрабатываются сообщением OnKeyPress, и по­этому чаще всего вам предстоит использовать событие OnKeyDown. Отметим, что, если пользователь удерживает клавишу нажатой, про­исходит несколько событий OnKeyDown. После того как пользова­тель отпустил клавишу, возникает событие OnKeyUp.

Ниже показано, как определить нажатие клавиши Ins.

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if Key = vk_Insert then Paneli.Caption := 'INS';

end;

Примечание. Для получения ASCII-кода клавиши используйте преобразование Chr(Key), например:

procedure TForm1.FormKeyDown(Sender: TObjeot; var Key: Word; Shift: TShiftState); begin

If Chr(Key) = 'A' Then {Нажата клавиша «А» }

end;

Событие OnKeyUp

Событие OnKeyUp является парным для OnKeyDown и возни­кает, когда пользователь отпускает нажатую ранее клавишу. Как и для события OnKeyDown, возможно распознать клавиши типа Shift, Alt и Ctrl и кнопки манипулятора «мышь». Параметр Key имеет тип Word, и для определения нажатой клавиши необходи­мо использовать коды виртуальных клавиш.

Примечание. Для того чтобы форма первой получала сообще­ния о нажатиях клавиш (OnKeyDown, OnKeyUp и OnKeyPress) вне зависимости от того, какой компонент имел фокус в момент получения сообщения, необходимо присвоить свойству KeyPreview значение True.

Событие OnKeyUp имеет тип TKeyEvent.

Это были события, возникающие после нажатия клавиш на клавиатуре. Теперь рассмотрим события, связанные с манипуля­тором «мышь». Интересно, что из-за небольшого размера сис­темной очереди (120 событий) при активной работе с манипуля­тором «мышь» очередь может быстро переполниться. Для пре­дотвращения этого ядро Windows использует следующую техни­ку: перед тем, как поместить сообщение от мыши в очередь, про­веряется ситуация, не является ли предыдущее сообщение (уже находящееся в очереди) сообщением от мыши. Если это так, то предыдущее сообщение замещается новым — ведь в большинст­ве случаев пользователю необходимо знать только конечную точ­ку, в которую переместился манипулятор, а не траекторию его движения.

Событие OnClick

Возникает при нажатии кнопки мыши в области компонента. Это событие также происходит, когда пользователь:

· выбрал элемент таблицы (grid), древовидного списка (outline), списка или комбинированного списка нажатием одной из кла­виш управления курсором;

· нажал клавишу Enter, когда активным элементом формы была кнопка со значением по умолчанию (заданная свойством De­fault);

· нажал клавишу Esc, когда в активной форме имелась кнопка Cancel (заданная свойством Cancel);

· нажал клавишу для вызова кнопки. Например, если кнопка име­ла заголовок ‘&Bold’, клавишей для вызова кнопки будет клавиша «В»

Событие OnClick имеет тип TNotifyEvent.

Событие OnDblClick

Событие OnDblClick возникает при двойном нажатии кнопки мыши в области компонента. Событие OnDblClick имеет тип TNotifyEvent.

Событие OnMouseDown

Событие OnMouseDown происходит при нажатии кнопки мыши, когда курсор находится в области компонента. Обработ­чик этого события используется в тех случаях, когда необходимо предпринять какие-либо действия при нажатии кнопки мыши в области компонента. Параметр Button этого события позволяет определить, какая кнопка была нажата, а параметр Shift — были ли нажаты клавиши Shift, Ctrl или Alt при нажатии кнопки мыши.

Ниже показано, как отслеживать нажатия кнопки мыши.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Begin

Label1.Caption := Format(‘X = %d Y = %d’, [X,Y])

end;

Событие OnMouseDown имеет тип TMouseEvent,описанный следующим образом:

TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;

Параметры Х и Y содержат координаты курсора мыши в мо­мент нажатия клавиши. Параметр Button имеет тип TMouseButtonи может принимать одно из следующих значений:

Значение Описание
mbRight нажата правая кнопка мыши
mbLeft нажата левая кнопка мыши
mbCenter нажата средняя кнопка мыши

Событие OnMouseMove

Это событие происходит при перемещении манипулятора «мышь». Параметр Shift позволяет определить, были ли нажаты клавиши Shift, Ctrl или Alt при нажатии кнопки мыши.

Событие OnMouseMove имеет тип TMouseMoveEvent,описан­ный следующим образом:

TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;

В приведенном ниже примере показано, как обрабатывать со­бытие OnMouseMove. Горизонтальная координата отображается компонентом MouseX, вертикальная — компонентом MouseY. Оба компонента имеют тип TLabel.

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

begin

MouseX.Caption := IntToStr(X);

MouseY.Caption := IntToStr(Y);

end;

Событие OnMouseUp

Событие OnMouseUp является парным для OnMouseDown и возникает в том случае, когда пользователь отпустил ранее нажа­тую кнопку мыши. Параметр Shift позволяет определить, были ли при этом нажаты клавиши Shift, Ctrl или Alt. Параметры X и Y содедасат координаты курсора мыши в момент нажатия клавиши. Параметр Button имеет тип TMouseButton(см. выше).

Ниже показано, как, обрабатывая события OnMouseDown и OnMouseUp, нарисовать прямоугольник, координаты левого верхне­го угла которого будут соответствовать точке нажатия клавиши мыши, а координаты правого нижнего угла — точке отпускания кнопки.

var

StartX, StartY: Integer; {В интерфейсной секции модуля формы }

procedure TForm1.ForniMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

StartX := X;

StartY := Y;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Form1.Canvas.Rectangle(StartX, StartY, X, Y);

end;

Сообщение OnMouseUp имеет тип TMouseEvent.

Наши рекомендации