События от клавиатуры и мыши
После того как мы познакомились с событиями, характерными для формы, давайте посмотрим на события, которые могут получать практически все визуальные компоненты — события от клавиатуры и мыши. Изначально источником этих событий является драйвер клавиатуры или драйвер мыши, затем ядро Windows преобразует их в стандартный вид и пересылает окну программы. Прежде чем послать сообщение о вводе с клавиатуры, ядро 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, когда активным элементом формы была кнопка со значением по умолчанию (заданная свойством Default);
· нажал клавишу 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.