Справочник по компонентам Delphi. Часть 1 - Реакция на события от мыши и клавиатуры

ОГЛАВЛЕНИЕ

 

Реакция на события от мыши и клавиатуры

Традиционно пользователь может предусмотреть реакцию на нажатие и отпус­кание любой из кнопок и перемещение курсора мыши. Эти три события обеспечивают интерфейс каждого элемента управления с мышью. Первые два из них имеют формат:

(рt) property OnMouseDown: TMouseEvent;
(Pb) property OnMouseUp: TMouseEvent;
TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
Параметры:
  • Sender — элемент-источник сообщения (обычно равен Self);
  • Button — идентификатор одной из кнопок;
  • TMouseButton = (mbLeft, mbRight, mbMiddle);
  • Shift — множество, которое может содержать элементы:
  • ssAlt, ssCtrl, ssShift — в зависимости от состояния этих клавиш;
  • ssLeft, ssRight, ssMiddle, ssDouble — в зависимости от нажатия кнопок мыши (ssDouble — нажать! и правая, и левая кнопки);
  • X, Y — координаты нажатия (в системе координат клиентской области получателя).

При перемещении мыши возникает событие:

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

Использование сообщений от мьшш уже встречалось в примерах, приведенных вьппе (например, см. разд. "Положение, размеры и выравнивание элементов управления").

Два события извещают о щелчке и двойном щелчке левой кнопкой мыши над компонентом:

 (pt) property OnClick: TNotifyEvent; 
(Pb) property OnDblClick: TNotifyEvent;

Отменить генерацию этих событий можно, удалив флаг csClickEvents из слова состояния элемента (ControlStyle). Для некоторых компонентов (например, кно­пок) OnClick возникает еще и при нажатии определенных клавиш на клавиатуре, а также вследствие вызова метода Click.

События, связанные с мышью, могут быть получены потомками TControl. В отличие от них, реакцию на события от клавиатуры могут иметь только оконные элементы управления ("могут", т. к. на уровне TControl и TWinControl эти события только описаны, но не опубликованы). Таким образом, есть компоненты (в том числе в Палитре компонентов), не имеющие связи с этими событиями из-за ее ненадобности. Впрочем, их меньшинство, и материал в этом разделе обобщен вполне обоснованно.

Нажатие и отпускание клавиш клавиатуры могут инициировать следующие события:

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

Генерация этих событий встроена в обработчики сообщений Windows WMJCEYDOWN, WMJSYSKEYDOWN и WM_KEYUP, WM_SYSKEYUP соответст­венно. Обработчику передаются:

  • Sender — источник сообщения;
  • Shift — состояние специальных клавиш и кнопок мыши во время нажатия (отпускания);
  • Key — код нажатой клавиши, представляющий собой виртуальный код клавиши Windows (константы вида VK_XX, например, VK_F1, VK_ESCAPE и т. п.). Обратите внимание, что Key является var-параметром; т. е. его значение может быть изменено программистом.

Другое событие, возникающее вследствие нажатия клавиши:

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

Это событие возникает при вводе с клавиатуры символа ASCII, т. е. оно не ге­нерируется, например, при нажатии функциональных клавиш или . Обработчик события вызывается при нажатии буквенных (в т. ч. вместе с ), цифровых клавиш, комбинаций + .. + (коды ASCII #1..#26), , , , + (код #3) и некоторых других. Также код ASCII можно сгенерировать, нажав <А11>+<десятичньш код символа> на числовой клавиатуре (Numeric Pad).

Событие OnKeyPress соответствует сообщению Windows WM_CHAR.

Все сообщения клавиатуры поступают тому элементу управления, который в данный момент имеет фокус ввода. Однако из этого правила возможно одно исключение. Если у формы, которая содержит этот элемент управления, свойство

 (Pb) property KeyPreview: boolean; 

установлено в True, то сначала все три вида сообщений поступают к ее обработчикам, и только потом — к элементу управления. Если при этом в них обнулить параметр Key, то в элемент сообщение не поступит вообще. В приведенном ниже примере клавиша резервируется для изменения со­стояния формы:

procedure TFormI.FormCreate(Sender: TObject); 
begin
    KeyPreview := True;
end;

procedure TFonnl.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
    if Key = VK_F5 then
    begin
        if ssCtrl in Shift then
            WindowState := wsNormal
        else
            if Shift = [] then WindowState := wsMaximized;
        Key : = 0;
    end;
end;