2 События клавиатуры
2.1 Последовательность событий
В оконных компонентах Delphi определены три события, связанные с клавиатурой. Это события:
ОпКеуDown |
Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ нажатой клавиши |
OnKeyPress |
Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши и кнопки |
OnKeyUp |
Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ отпускаемой клавиши |
Кроме того, при нажатии пользователем клавиши табуляции фокус может переключаться с элемента на элемент, что вызывает описанные в разделе 1.1 события OnEnter и OnExit.
Важно четко представлять последовательность событий, происходящих при нажатии пользователем клавиши или комбинации клавиш. Пусть, например, пользователь нажал клавишу Shift (перевел ввод в верхний регистр), а затем нажал клавишу символа 'н'. Последовательность событий для этого случая приведена в таблице 3. В таблице указано, что именно можно распознать при каждом событии. Подробнее это будет рассмотрено ниже, а пока отметим, что различить символ в верхнем и нижнем регистрах и различить латинский символ и символ кириллицы можно только в обработчике события OnKeyPress. Действительно, хотя в событии OnKeyDown при нажатии клавиши 'н' можно определить, что при этом одновременно нажата и клавиша Shift, этого еще мало, чтобы утверждать, что символ относится к верхнему регистру. Ведь если перед этим была включена клавиша CapsLock, то при нажатой клавише Shift символ окажется в нижнем регистре. А информация о том, включена или выключена клавиша CapsLock, в обработчик события OnKeyDown не передается.
Таблица 3 Последовательность событий клавиатуры при нажатии клавиш Shift-н
Действие пользователя |
Событие |
Нажатие клавиши Shift |
OnKeyDown. Возможно распознавание нажатой клавиши Shift |
Нажатие клавиши «н» |
OnKeyDown. Возможно распознавание нажатой клавиши Shift, нажатой клавиши «н», но отличить верхний регистр от нижнего и латинский символ от русского невозможно OnKeyPress. Возможно распознавание символа с учетом регистра и языка, но невозможно распознавание нажатой клавиши Shift |
Отпускание клавиши «н» |
OnKeyUp. Возможно распознавание нажатой клавиши Shift, отпущенной клавиши «н», но отличить верхний регистр от нижнего и латинский символ от русского невозможно |
Отпускание клавиши Shift |
OnKeyUp. Возможно распознавание отпущенной клавиши Shift |
Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.
В заключение надо остановиться на вопросе, куда поступают события клавиатуры. У формы имеется свойство KeyPreview. Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойство KeyPreview равно false и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значение KeyPreview равным true, то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.
Имеется также событие OnShortCut приложения (Application), которое возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событие OnKeyDown компонента или формы. Это событие, как и все события приложения, перехватывает компонент ApplicationEvents. Обработчик этого события позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения Windows Msg, поле CharCode которого (Msg.CharCode) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметр Handled. Если задать ему значение true, то стандартные события OnKeyDown, OnKeyPress, OnKeyUp не наступят.
Пусть, например, вы хотите, чтобы при нажатии пользователем клавиши «Q» приложение закрывалось, спросив предварительно пользователя, действительно ли он хочет кончить работу. Тогда обработчик события OnShortCut компонента ApplicationEvents может иметь вид:
procedure TForml.ApplicationEventslShortCut(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» (в любом регистре и независимо от установки русского или английского языка — см. подробнее о распознавании клавиш в разделе.2.2), то пользователю методом Application.Message-Box предлагается диалоговое окно с запросом о завершении работы. Если пользователь в нем нажмет кнопку До, то приложение закрывается методом Application.Terminate.