Код клавиши enter delphi
Коды клавиш Delphi
Таблица кодов клавиш, которыми можно пользоваться при проверке параметра Key в обработчиках событий OnKeyDown и OnKeyUp :
Клавиша
Дес.
число
Шест.
число
Символическое
имя
Сравнение по
функции ord
Правая клавиатура при выключенной клавише NumLock:
Код клавиши enter delphi
На этом шаге мы рассмотрим способы определения нажатых клавиш.
Заголовок обработчика события OnKeyDown может иметь, например, следующий вид:
Параметр Sender , указывающий на источник события, уже рассматривался на шаге 6. Там же рассматривался и параметр Shift , представляющий собой множество элементов, отражающих нажатые в это время функциональные клавиши. Только в обработчике события OnKeyDown множество возможных элементов параметра Shift сокращено до:
- ssShift (нажата клавиша Shift ),
- ssAlt (нажата клавиша Alt ) и
- ssCtrl (нажата клавиша Ctrl ).
Информация о нажатых кнопках мыши отсутствует.
Основной параметр, которого не было раньше — это параметр Key . Обратите внимание, что он определен как var , т.е. может изменяться в обработчике события. Кроме того, обратите внимание, что это целое число, а не символ.
Параметр Key определяет нажатую в момент события клавишу клавиатуры. (Для не алфавитно-цифровых клавиш используются виртуальные коды API Windows . Полная таблица этих кодов приведена в приложении 2. Ниже в таблице 1 приведены для дальнейшего обсуждения только несколько строк из нее, соответствующих наиболее распространенным клавишам.
Параметр Key является целым числом, определяющим клавишу, а не символ . Например, один и тот же код соответствует прописному и строчному символам «Y» и «y» . Если, как это обычно бывает, в русской клавиатуре этой клавише соответвуют символы кириллицы «Н» и «н» , то их код будет тем же самым. Различить прописные и строчные символы или символы латинские и кириллицы невозможно .
Проверять нажатую клавишу можно, сравнивая Key с целым десятичными кодом клавиши, приведенном во втором столбце таблицы 1. Например, реакцию на нажатие пользователем клавиши Enter можно оформить оператором:
Можно сравнивать Key и с шестнадцатеричным эквивалентом кода, приведенным в третьем столбце таблицы 1. Например, приведенный выше оператор можно записать в виде:
Для клавиш, которым не соответствуют символы, введены также именованные константы, которые облегчают написание программы, поскольку не требуют помнить численные коды клавиш. Например, приведенный выше оператор можно записать в виде:
Для клавиш символов и цифр можно производить проверку сравнением c десятичным или шестнадцатеричным кодом, но это не очень удобно, так как трудно помнить коды различных символов. Другой путь — воспользоваться функций ord , определяющей код символа. Коды латинских символов в верхнем pегистре совпадают с виртуальными кодами, используемыми в параметре Key . Поэтому, например, если вы хотите распознать клавишу, соответствующую символу «Y» , можете написать:
В этом операторе можно использовать только латинские символы в верхнем регистре. Если вы напишете ord(‘y’) или захотите написать русские символы, соответствующие этой клавише — ord(‘Н’) или ord(‘н’) , то оператор не сработает.
Помните также, что оператор будет действовать на все символы, относящиеся к указанной клавише: «Y», «у», «Н» и «н». Иногда это хорошо, а иногда плохо. Например, если вы задали пользователю какой-то вопрос, на который он должен ответить Y (да) или N (нет), то подобный оператор избавляет пользователя от необходимости следить, в каком регистре он вводит символ и какой язык — английский или русский включен в данный момент. Ему достаточно просто нажать клавишу, на которой написано «Y» . Однако, если пользователь более привык к символам кириллицы, то могут возникнуть неприятности, поскольку нажимая клавишу с латинской буквой «Y» и русской буквой «Н» он может думать, что отвечает не положительно ( Yes — да), а отрицательно (Нет).
Приведем еще один пример — автоматическую передачу фокуса очередному оконному компоненту при нажатии пользователем клавиши Enter . Это можно сделать, включив в общий обработчик событий OnKeyDown всех оконных компонентов оператор:
Этот оператор с помощью метода FindNextControl ищет очередной компонент в последовательности табуляции и передает ему фокус.
В заключение приведем пример распознавания комбинации клавиш. Пусть вы хотите, например, распознать комбинацию Alt-X . Для этого вы можете написать оператор:
На следующем шаге мы продолжим рассмотривать события, связанные с клавиатурой. В частности, поговорим о событии OnKeyPress .
Delphi 2010. Работа с клавиатурой в условиях Unicode.
Как я уже отмечал, начиная с Delphi 2009 введена полная поддержка Unicode. Это замечательно, необходимо и важно. Однако, как ни крути, но не все толком понимают как работать-то? Я сейчас не имею ввиду профессиональных программистов, работающих постоянно с Delphi. Речь идёт о простых любителях, начинающих программистах, которые большую часть информации получают из Сети, в результате чего возникают всякие непредвиденные ситуации. Вот, например, ситуация — надо написать программу, которая будет отлавливать нажатия клавиш клавиатуры и записывать их в лог. В Интернет есть масса примеров как организовать глобальный хук на клаву и считывать в лог виртуальные и скан-коды клавиш (подобная статья есть и у нас в блоге). Естественно, начинающий программист просто качает готовый пример и пробует транслировать эти самые коды в буковки…а они просто так не транслируются — получаем либо «кракозябры» либо нормальные буквы но не те. И сидит такой начинающий программист, чешет затылок и другие части тела, не понимая что он делает не так? В лучшем случае лезет в опять в Сеть и с огромной вероятностью натыкается на подобного рода «рецепты-объяснения»:
В событиях OnKeyDown и OnKeyUp, Key является беззнаковым двухбайтовым (Word) значением, которое представляет виртуальную клавишу Windows. Для получания значения символа можно воспользоваться функцией Chr. В событии OnKeyPress параметр Key является значением Char, которое представляет символ ASCII.
Вроде все правильно. НО не для Delphi 2009-2010, при работе с русскими символами, так как во-первых, введена поддержка Unicode, а во-вторых ASCII никогда с роду не содержала русских букв (см.историю разработки кодировок). И никогда, ни при каких обстоятельствах Вы не сможете перевести просто так виртуальную клавишу в русский символ функцией Chr.
Если не верите — проделайте такой простой эксперимент: откройте Delphi 2009-2010, создайте новое приложение и в событии onKeyUp для главной формы напишите такой код:
Теперь запустите приложение, переключитесь на русский язык и нажмите любую клавишу.
Вот результат нажатия русской буквы «Ы»:
Спрашивается: Чё за фигня? Где моя буковка «Ы»? И, что самое интересное, я ведь нажимал букву без Shift и CapsLock, а мне чего-то буква в верхнем регистре упала? Давайте разбираться в определениях. Так как без четкого знания определений мы с Вами в этих лабиринтах и хитросплетениях не разберемся никогда.
1. Скан-коды, виртуальные код и коды символов
Итак, с клавиатурой связано как минимум три разновидности кодов: скан-код, символьный код и виртуальный код. И далеко не все начинающие программисты понимают различия между ними.
Самая большая путаница со скан-кодами. Для начала, их существует две разновидности. Есть скан-коды «настоящие» — это то, что получает система прямо от клавиатуры, а есть скан-коды которые выдаются после того, как они будут обработаны в BIOS, которая интерпретирует, например, одновременное нажатие клавиш-модификаторов, а также справляется с текущей таблицей кодов символов и отправляет эти скан-коды в буфер клавиатуры.
Теперь посмотрим, как выглядит скан-код в принципе. На рисунке представлена оригинальная 84-кнопочная клавиатура IBM PC. Вот во времена существования этой клавиатуры и назначались скан-коды клавишам. Причем присваивались они слева-направо, начиная с клавиши Esc. Так клавиша Esc получила скан-код 1, а клавиша 1 — код 2 и т.д. Пока не будем кидаться в дебри дополнительных клавиш, которые появились на современных клавиатурах (там есть свои особенности присвоения скан-кодов), а уясним для себя следующее:
Скан-код — это идентификатор клавиши на клавиатуре и он один в чистом виде никак не может сам по себе описать символ в условиях unicode
Теперь двигаемся дальше. Разберемся с виртуальными кодами.
Виртуальные коды — это то, что использует система (Windows) для идентификации клавиш.
То есть, проведя простую аналогию, можно с большим допущением сказать, что виртуальный код клавиши — это тот же скан-код, но только не для BIOS, а для операционной системы, установленной на компьютере пользователя.
С некоторыми из констант, определяющих виртуальный код клавиш Вы можете ознакомиться в модуле windows.pas Delphi. Но, там отсутствуют коды для буквенно-цифровых клавиш, т.к. они совпадают с соответствующими символами из таблицы ASCII .
Теперь, я думаю, становится более-менее ясно почему при нажатии клавиши с буквой «ы» мы в примере получили заглавную букву «S»? Delphi в этом случае сработала идеально правильно — выдала именно виртуальный код клавиши, как и полагается.
А для того, чтобы получить русскую букву нам необходимо знать третий код — код символа в таблице символов Unicode или, как мы посмотрим ниже, скан-код, виртуальный код и ещё один параметр — состояние клавиатуры.
Для того, чтобы продемонстрировать правильность работы Delphi, немного допишем наш пример.