Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_N6_.doc
Скачиваний:
0
Добавлен:
24.04.2019
Размер:
166.91 Кб
Скачать

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.