В оконных компонентах C++Builder определены три события, связанные с клавиатурой. Это события:
Событие Описание
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 при нажатии символьной клавиши не наступает. А при нажатой клавише ОН событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.
Остановиться на вопросе, куда поступают события клавиатуры. У формы имеется свойство KeyPreview. Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойство KeyPreview равно false и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значение KeyPreview равным true, то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.
Имеется также событие OnShortCut приложения (Application), которое возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событие OnKeyDown компонента или формы. Это событие, как и все события приложения, перехватывает введенный в C++Builder5 компонент ApplicationEvents. Обработчик этого события позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения Windows Msg, поле CharCode которого (Msg.CharCode) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметр Handled. Если задать ему значение true, то стандартные события OnKeyDown, OnKeyPress, OnKeyUp не наступят.
