Шаг 31.
Класс TWinControl. Реакция на события от мыши и клавиатуры

    На этом шаге мы продолжим изучение некоторых событий и методов класса TWinControl. Полный перечень свойств, методов и событий приведен на шаге 17. С дополнительной информацией по обработке нажатия кнопок мыши можно познакомиться на шагах 5 и 6, а по обработке нажатия клавиш на клавиатуре - на шагах 7, 8 и 9.

    Можно предусмотреть реакцию на нажатие и отпускание кнопок и перемещение курсора мыши. Первые два из них имеют формат:

   property OnMouseDown: TMouseEvent; 
   property OnMouseUp: TMouseEvent; 
   TMouseEvent  =  procedure (Sender: TObject; Button: TMouseButton; 
                   Shift: TShiftState; x, y: Integer) of object; .

    Параметры:

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

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

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

   property OnClick: TNotifyEvent; 
   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 WM_KEYDOWN, WM_SYSKEYDOWN и WM_KEYUP, WM_SYSKEYUP соответственно.

    Обработчику передаются:

    Обратите внимание, что Key является var-параметром; то есть его значение может быть изменено программистом.

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

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

    Это событие возникает при вводе с клавиатуры только ASCII-символа. Таким образом, оно не генерируется, например, при нажатии функциональных клавиш или клавиши Caps Lock. Обработчик события вызывается при нажатии буквенных (в том числе вместе с клавишей Shift) клавиш, комбинаций Ctrl+A .. Ctrl+Z (коды ASCII #1..#26), клавиш Enter, Esc, Backspace, Ctrl+Break (ее код - #3) и некоторых других. Также ASCII-код можно сгенерировать, нажав клавиши Alt+<десятичный код символа> на числовой клавиатуре.

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

   property KeyPreview: Boolean; 

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

procedure  TForml.FormCreate(Sender: TObject); 
begin
   //Установка приоритета формы при обработке событий.
   KeyPreview:= True; 
end;

//Обработчик нажатия клавиши.
procedure TForm1.FormKeyDown(Sender: TObject;  var  Key: Word; 
         Shift: TShiftState); 
begin
   if Key = VK_F5   then  
//Если нажата клавиша F5
   begin
    //и при этом еще и клавиша Ctrl,
    if ssCtrl in Shift  then 
         WindowState := wsNormal//то форма будет нормального размера.
    else
         //В противном случае окно будет развернуто на весь экран.
         if Shift =  [ ]  then WindowState := wsMaximized; 
   end;
   Key:= 0; //Обнуляя параметр, мы запрещаем дальнейшую обработку.
end;

    На следующем шаге мы продолжим изучение состава класса TWinControl, в частности, разберем понятие фокус ввода.




Предыдущий шаг Содержание Следующий шаг