Главная » Delphi » Особенности работы с клавиатурой в Delphi

0

Один из самых простых вариантов работы с клавишами— через событие onshortcut формы — мы рассмотрим в главе 15. Этот вариант отличается тем, что он перехватывает все клавиши, в том числе и стрелки управления курсором, идентифицируя виртуальный код нажатой клавиши. При этом работа происходит, что немаловажно, независимо от установки параметра KeyPreview — т. е. все нажатия клавиш, кроме перехваченных, будут доходить куда надо. Здесь же мы остановимся на стандартных событиях Windows.

Виртуальные коды служат параметром в процедуре Delphi по событию onKeyDown, при этом можно еще отдельно проанализировать, нажата ли одновременно какая-нибудь из клавиш-модификаторов, и таким образом искусственно определить, какой именно символ имел в виду пользователь, когда на-

7 Зак 1324 жимал на клавишу. Но вот определить при этом, нажата ли клавиша <Caps Lock>, не удастся. Зато в процедуре oriKeyPress возвращается именно символ, с учетом национальной раскладки и регистра, однако системные клавиши там не отслеживаются. Кстати, если вы попробуете использовать функцию MapvirtualKey (см. главу б) в обработчике onKeyPress (разумеется, с параметром ord(Key) вместо просто Key), то увидите, что она выдает правильное значение скан-кода только при нажатии буквы в английской раскладке в верхнем регистре, в остальных случаях выдается чепуха.

Поэтому, если нужно отследить нажатие системных клавиш и одновременно получить различия между русскими и английскими буквами, приходится выворачиваться — например, включать оба обработчика одновременно. Типичный пример такой дурацкой ситуации— когда вы самостоятельно пишите диалог с кнопками Да (Yes) и Нет (No) и при этом еще желательно, чтобы сфокусированная кнопка срабатывала при нажатии <Enter>. Дело в том, что английская буква "Y" (ответ "Yes") и русская буква "н" (ответ "Нет") расположены на одной клавише, поэтому использовать событие onKeyDown не получится, на все варианты ("Y", "у", "Н", "н") обработчик выдаст одно и то же значение кеу=59 (vk_y). А если использовать событие onKeyPress, то не удастся отследить нажатие <Enter>. Один из вариантов выхода из этой ситуации без того, чтобы загромождать программу множеством обработчиков, состоит в том, чтобы использовать функцию API GetKeyboardLayout (возвращающую тот самый национальный идентификатор языка, с которым мы мучались в предыдущих главах— число, в двух младших байтах которого содержится собственно идентификатор) для определения того, какая раскладка действует в данный момент. Но подобное требуется все же крайне редко— обычно удается обойтись процедурами onKeyDown И onKeyPress ДЛЯ ТОГО, чтобы опознать любой вариант результата диалога. Давайте несколько искусственно проиллюстрируем использование этих процедур для организации диалога на примере проекта SlideShow (в варианте из главы 4, версия 1.20). Сначала мы приведем пример того, как можно создать собственное диалоговое окно, которое заменит нам невыразительный MessageBox. В данном случае — для отклика на попытку запустить программу повторно.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии