На этом шаге мы продолжим изучение некоторых событий и методов класса
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, в частности, разберем понятие фокус ввода.