
Обработка событий клавиатуры 7 События клавиатуры Последовательность событий
В оконных компонентах Delphi определены три события, связанные с клавиатурой. Это события:
OnKeyDown Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ нажатой клавиши
OnKeyPress Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши и кнопки.
OnKeyUp Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ отпускаемой клавиши
Кроме того, при нажатии пользователем клавиши табуляции фокус может переключаться с элемента на элемент, что вызывает события OnEnter и OnExit.
Важно четко представлять последовательность событий, происходящих при нажатии пользователем клавиши или комбинации клавиш. Пусть, например, пользователь нажал клавишу Shift (перевел ввод в верхний регистр), а затем нажал клавишу символа 'н'. Последовательность событий для этого случая приведена в табл. 1. В таблице указано, что именно можно распознать при каждом событии. Подробнее это будет рассмотрено ниже, а пока отметим, что различить символ в верхнем и нижнем регистрах и различить латинский символ и символ кириллицы можно только в обработчике события OnKeyPress. Действительно, хотя в событииOnKeyDown при нажатии клавиши 'н' можно определить, что при этом одновременно нажата и клавиша Shift, этого еще мало, чтобы утверждать, что символ относится к верхнему регистру. Ведь если перед этим была включена клавиша CapsLock, то при нажатой клавише Shift символ окажется в нижнем регистре. А информация о том, включена или выключена клавиша CapsLock, в обработчик событияOnKeyDown не передается.
Таблица 1. Последовательность событий клавиатуры при нажатии клавиш Shift-н
Действие пользователя |
Событие |
Нажатие клавиши Shift
|
OnKeyDown. Возможно распознавание нажатой клавиши Shift. |
Нажатие клавиши "н"
|
OnKeyDown. Возможно распознавание нажатой клавиши Shift, нажатой клавиши "н", но отличить верхний регистр от нижнего и латинский символ от русского невозможно.
|
OnKeyPress. Возможно распознавание символа с учетом регистра и языка, но невозможно распознавание нажатой клавиши Shift
| |
Отпускание клавиши "н" |
OnKeyUp. Возможно распознавание нажатой клавиши Shift, отпущенной клавиши "н", но отличить верхний регистр от нижнего и латинский символ от русского невозможно. |
Отпускание клавиши Shift |
OnKeyUp. Возможно распознавание отпущенной клавиши Shift. |
Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift.
Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только событияOnKeyDown при нажатии иOnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событиеOnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событиеOnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.