
Событие OnKeyPress
Заголовок обработчика этого события имеет вид:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
В этот обработчик, как и в описанные выше, передается параметр Key, определяющий нажатую клавишу символа. Но обратите внимание, что тип этого параметра не целое число, как в предыдущих случаях, a Char — символ. В данном случае в обработчик передается не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква, или строчная, русская, или латинская. Поэтому описанных выше сложностей с распознаванием символов не возникает.
Пусть, например, вы задали пользователю вопрос, на который он должен ответить символами “Д” или “д” (да), или символами “Н” или “н” (нет). Тогда распознать положительный ответ в обработчике события OnKeyPress можно оператором:
if ((Key = ' Д ' ) or (Key = ' д ' ) > then ...
Этот оператор можно записать короче, воспользовавшись операцией in:
if (Key in ['Д', ' д ' ] ) then
Приведенные операторы реагируют только на положительный ответ пользователя, не реагируя на отрицательный или ошибочный ответ. Реакцию на все возможные ответы обеспечивает структура case:
caseKeyof
'Д','д': ...;
‘Н’ , ‘н’:…;
else
beep;
end;
Здесь предусмотрена реакция на положительный и отрицательный ответ, а также звуковой сигнал при ошибочном ответе.
Посмотрев на приведенный ранее заголовок обработчика, вы можете увидеть, что параметр Key передается как var. Это позволяет в обработчике изменять этот параметр, изменяя соответственно его стандартную обработку в компоненте, поскольку ваш обработчик события срабатывает раньше стандартного обработчика компонента. Пусть, например, вы хотите иметь на форме окно редактирования Editl, в котором пользователь должен вводить только целые числа без знака, разделенные запятыми или пробелами. Вы можете обеспечить безошибочный ввод, подменяя все недопустимые символы нулевым с помощью, например, такого оператора:
if not (Key in [ ’0’ . , ‘ 9 ‘ , ’ ‘, ‘, ‘ ] ) then Key := #0;
При нажатии пользователем любой клавиши, кроме клавиш с цифрой, запятой или пробелом, символы подменяются нулевым символом и просто не появляются в окне редактирования/ Можно добавить в обработчик звуковой сигнал при нажатии пользователем ошибочной клавиши:
if not (Key in [ ’0’ . , ‘ 9 ‘ , ’ ‘, ‘, ‘ ]) then
begin
Key := #0;
Beep;
end;
Свойство формы KeyPreview
В заключение надо остановиться на вопросе, куда поступают события клавиатуры. У формы имеется свойство KeyPreview. Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойствоKeyPreview равноfalse и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значениеKeyPreview равнымtrue, то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.
Событие приложения OnShortCut
Имеется также событие OnShortCut приложения(Application), которое возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событиеOnKeyDown компонента или формы. Это событие, как и все события приложения, перехватывает компонентApplicationEvents. Обработчик этого события позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения WindowsMsg, полеCharCode которого(Msg. CharCode) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметрHandled. Если задать ему значениеtrue, то стандартные событияOnKeyDown, OnKeyPress, OnKeyUp не наступят.
Пусть, например, вы хотите, чтобы при нажатии пользователем клавиши “Q”приложение закрывалось, спросив предварительно пользователя, действительно ли он хочет кончить работу. Тогда обработчик события OnShortCut компонентаApplicationEvents может иметь вид:
procedureTForml.ApplicationEventslShortCut(varMsg:TWMKey;varHandled: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.