Шаг 7.
События клавиатуры

    На этом шаге мы начнем рассматривать события, связанные с клавиатурой.

    В оконных компонентах Delphi определены три события, связанные с клавиатурой. Это события (таблица 1):

Таблица 1. События, связанные с клавиатурой
Событие Описание
OnKeyDown Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ нажатой клавиши.
OnKeyPress Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши и кнопки.
OnKeyUp Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ отпускаемой клавиши.

    Кроме того, при нажатии пользователем клавиши табуляции фокус может переключаться с элемента на элемент, что вызывает события OnEnter и OnExit.

    Важно четко представлять последовательность событий, происходящих при нажатии пользователем клавиши или комбинации клавиш. Пусть, например, пользователь нажал клавишу Shift (перевел ввод в верхний регистр), а затем нажал клавишу символа 'н'. Последовательность событий для этого случая приведена таблице 2. В таблице указано, что именно можно распознать при каждом нажатии. Отметим, что различить символ в верхнем и нижнем регистрах и различить латинский символ и символ кириллицы можно только в обработчике события OnKeyPress. Действительно, хотя в событии OnKeyDown при нажатии клавиши 'н' можно определить, что при этом одновременно нажата и клавиша Shift, этого еще мало, чтобы утверждать, что символ относится к верхнему регистру. Ведь если перед этим была включена клавиш CapsLock, то при нажатой клавише Shift символ окажется в нижнем регистре. А информация о том, включена или выключена клавиша CapsLock, в обработчик события OnKeyDown не передается.

Таблица 2. Последовательность событий клавиатуры при нажатии клавиш Shift+н
Действие пользователя Событие
Нажатие клавиши Shift. OnKeyDown. Возможно распознавание нажатой клавиши Shift.
Нажатие клавиши "н". OnKeyDown. Возможно распознавание нажатой клавиши Shift, нажатой клавиши "н", но отличить верхний регистр от нижнего и латинский символ от русского невозможно.
  OnKeyPress. Возможно распознавание символа с учетом регистра и языка, но невозможно распознавание нажатой клавиши Shift.
Отпускание клавиши "н". OnKeyUp. Возможно распознавание нажатой клавиши Shift, отпущенной клавиши "н", но отличить верхний регистр от нижнего и латинский символ от русского невозможно.
Отпускание клавиши Shift. OnKeyUp. Возможно распознавание отпущеной клавиши Shift.

    Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.

    В заключение надо остановиться на вопросе, куда поступают события клавиатуры. У формы имеется свойство KeyPreview. Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойство KeyPreview paвно false и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значение KeyPreview равным trueе, то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.


    Замечание. Имеется также событие OnShortCut приложения (Application), которое возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событие OnKeyDown компонента или формы. Это событие, как и все события приложения, перехватывает введенный в Delphi 5 компонент АрplicationEvents. Обработчик этого события позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения Windows Msg, поле CharCode которого (Msg.CharCode) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметр Handled. Если задать ему значение true, то стандартные события OnKeyDown, OnKeyPress, OnKeyUp не наступят.

    Пусть, например, нужно, чтобы при нажатии пользователем клавиши "Q" приложение закрывалось, спросив предварительно пользователя, действительно ли он хочет закончить работу. Тогда обработчик события OnShortCut компонента ApplicationEvents может иметь вид:

   procedure TForm1.ApplicationEvents1ShortCut(var Msg:   TWMKey;
                                               var Handled:   Boolean);
   begin
     if Msg.CharCode = Ord('Q') then
       if Application.MessageBox('Действительно хотите завершить  работу?',
            'Подтвердите завершение',   MB_YESNOCANCEL+MB_ICONQUESTION) = IDYES
       then Application.Terminate;
    end;
Текст этого примера можно взять здесь.

    Если пользователь нажал клавишу с символом "Q" (в любом регистре и независимо от установки русского или английского языка), то пользователю методом Application.MessageBox предлагается диалоговое окно с запросом о завершении работы. Если пользователь в нем нажмет кнопку Да, то приложение закрывается методом Application.Terminate.


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




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