Заголовок обработчика события OnKeyDown может иметь, например, следующий вид:
void_fastcall TForml::EditlKeyDown(TObject *Sender,
WORD SKey, TShiftState Shift)
Параметр Sender, указывающий на источник события, уже обсуждался выше при описании событий мыши. Там же рассматривался и параметр Shift, представляющий собой множество элементов, отражающих нажатые в это время функциональные клавиши. Только в обработчике события OnKeyDown множество возможных элементов параметра Shift сокращено до ssShift (нажата клавиша Shift), ssAlt (нажата клавиша Alt) и ssCtrl (нажата клавиша Ctrl). Информация о нажатых кнопках мыши отсутствует.
Основной параметр, которого не было раньше — это параметр Key. Обратите внимание, что он передается по ссылке, т.е. может изменяться в обработчике события. Кроме того, обратите внимание, что это целое число, а не символ.
Параметр Key определяет нажатую в момент события клавишу клавиатуры. Для не алфавитно-цифровых клавиш используются виртуальные коды API Windows. Ниже в таблице 3 приведены только несколько строк из основной таблицы, соответствующих наиболее распространенным клавишам.
Таблица 3. Некоторые коды клавиш
Клавиша Десятичное
число Шестнадцатиричное
число Символическое
имя Сравнение по
символу
F1 112 0x70 VK_F1
Enter 13 0x0D VK_RETURN
Shift 16 0x10 VK_SHIFT
Ctrl 17 0x11 VK_CONTROL
Alt 18 0x12 VK_MENU
Esc 27 0x1B VK_ESCAPE
0) 48 0x30 0
1! 49 0x31 1
n N т Т 78 0x4E N
y Yн Н 89 0x59 Y
Параметр Key является целым числом, определяющим клавишу, а не символ. Например, один и тот же код соответствует прописному и строчному символам « Y» и «у». Если, как это обычно бывает, в русской клавиатуре этой клавише соответствуют символы кириллицы «Н» и «н», то их код будет тем же самым. Различить прописные и строчные символы или символы латинские и кириллицы невозможно.
Проверять нажатую клавишу можно, сравнивая Key с целым десятичным кодом клавиши, приведенном во втором столбце таблицы 3. Например, реакцию на нажатие пользователем клавиши Enter можно оформить оператором:
if(Key == 13) … ;
Можно сравнивать Key и с шестнадцатеричным эквивалентом кода, приведенным в третьем столбце таблицы 3. Например, приведенный выше оператор можно записать в виде:
if(Key == OxOD) … ;
Для клавиш, которым не соответствуют символы, введены также именованные константы, которые облегчают написание программы, поскольку не требуют помнить численные коды клавиш. Например, приведенный выше оператор можно записать в виде:
if(Key == VK_RETURN) … ;
Для клавиш символов и цифр можно производить проверку сравнением с десятичным или шестнадцатеричным кодом, но это не очень удобно, так как трудно помнить коды различных символов. Другой путь — воспользоваться тем, что коды латинских символов в верхнем регистре совпадают с виртуальными кодами, используемыми в параметре Key. Поэтому, например, если вы хотите распознать клавишу, соответствующую символу «Y», вы можете написать:
if(Key == ‘Y’) … ;
В этом операторе можно использовать только латинские символы в верхнем регистре. Если вы напишете ‘у’ или захотите написать русские символы, соответствующие этой клавише — ‘Н’ или ‘н’, то оператор на сработает.
Помните также, что оператор будет действовать на все символы, относящиеся к указанной клавише: «Y», «у», «Н» и «н». Иногда это хорошо, а иногда плохо. Например, если вы задали пользователю какой-то вопрос, на который он должен ответить Y (да) или N (нет), то подобный оператор избавляет пользователя от необходимости следить, в каком регистре он вводит символ и какой язык — английский или русский включен в данный момент. Ему достаточно просто нажать клавишу, на которой написано «Y». Однако, если пользователь более привык к символам кириллицы, то могут возникнуть неприятности, поскольку нажимая клавишу с латинской буквой «Y» и русской буквой «Н» он может думать, что отвечает не положительно (Yes — да), а отрицательно (Нет).
Приведем еще один пример — автоматическую передачу фокуса очередному оконному компоненту при нажатии пользователем клавиши Enter. Это можно сделать, включив в общий обработчик событий OnKeyDown всех оконных компонентов оператор:
if(Key == VK_RETURN)
FindNextCor.trol ( (TWinControl *) Sender, true, true, false)->SetFocus();
Этот оператор с помощью метода FindNextControl ищет очередной компонент в последовательности табуляции и передает ему фокус.
В заключение приведем пример распознавания комбинации клавиш. Пусть вы хотите, например, распознать комбинацию Alt-X. Для этого вы можете написать оператор:
if((Key == ‘X’) && Shift.Contains(ssAlt)) … ;
Мы рассмотрели распознавание клавиш при событии OnKeyDown. Заголовок обработчика события OnKeyUp имеет такой же вид, так что все сказанное в равной степени относится и к событиям при отпускании клавиш.
Заголовок обработчика события OnKeyPress имеет вид:
void _fastcall TForml::EditlKeyPress(TObject *Sender,
char SKey)
В этот обработчик передается параметр Key, определяющий нажатую клавишу символа. Тип этого параметра – char. В данном случае в обработчик передается не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква или строчная, русская или латинская.
7. Множества
Множество – группа элементов, которая ассоциируется с её именем и с которой можно сравнивать другие величины , чтобы определить принадлежат ли они этому множеству.
Объявление множества:
Set< tipe,minval,maxval > переменные;
Tipe – тип элементов множества. Обычно это порядковые типы int, char или перечислимый.
Minval и maxval типа unsigned char определяют мин. и макс. значения элементов множества.
Минимальное значение должно быть не меньше 0, максимальное — не более 255.
Примеры:
1) Set < char, ‘A’, ‘Z’ > s1; // объявление переменной s1 как множество всех заглавных латинских букв.
2) Set < char, 0, 255 > Ch; // множество ch, содержащее все символы.
3) typedef Set < char, ‘A’, ‘Z’ > UPPERCACESet;
UPPERCACESet s1, s2; // объявление типа UPPERCACESet множества всех заглавных латинских букв и объявление переменных s1, s2 этого типа.
Контрольные вопросы:
1. Проекты С++ Builder
2. Справочная система С++ Builder
3. График Chart
4. Таймер
5. События мыши и клавиатуры
