На этом шаге мы продолжим изучение некоторых событий и методов класса
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; .
Параметры:
- Sender - элемент-источник сообщения (обычно равен Self);
- Button - идентификатор одной из кнопок. TMouseButton = (mbLeft,
mbRight, mbMiddle); - Shift - множество, которое может содержать элементы:
- ssAlt, ssCtrl, ssShift - в зависимости от состояния этих
клавиш; - ssLeft, ssRight, ssMiddle, ssDouble - в зависимости от
нажатия кнопок мыши (ssDouble - нажаты и правая, и левая
кнопки); - X, Y - координаты нажатия (в системе координат
клиентской области получателя).
- ssAlt, ssCtrl, ssShift - в зависимости от состояния этих
При перемещении мыши возникает событие:
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 соответственно.
Обработчику передаются:
- 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-символа.
Таким образом,
оно не генерируется, например, при нажатии функциональных клавиш или
клавиши
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,
в частности, разберем понятие фокус ввода.