с := UpCase( с )
until ( с in ['Q'..'V'] );
Можно, конечно, написать свою собственную функцию перевода в верхний регистр, работающую и с кириллицей, но эта функция
- 496 -
будет «от рождения» зависеть от типа кодировки кириллицы. А определить программно тип кодировки практически невозможно.
21.2. Опрос клавиши в регистре Ctrl
Опрос клавиши в регистре Ctrl мало чем отличается от обычного опроса. Правда, при нажатой клавише Ctrl эффект от нажатия алфавитной клавиши определяется ее латинским названием, даже если включен регистр кириллицы. Вопрос же в том, что вернет функция ReadKey в этом случае. Профессионалы могут получить ответ на этот вопрос из табл. 21.1 и не читать этот раздел. Нажатие в регистре Ctrl клавиши на алфавитной клавиатуре выдает в ReadKey ASCII-код в диапазоне 1..26. Значение этого кода равно порядковому номеру буквы в английском алфавите (Ctrl+A даст 1, а Ctrl+Z — 26). Поэтому, получив после выполнения строки
C := ReadKey
в переменную C управляющий символ, ее надо сравнивать уже не с алфавитом, а с самими управляющими символами. Пусть, например, надо опросить только комбинации Ctrl+F, Ctrl+P и Ctrl+S. Это можно сделать двумя способами:
1) repeat 2) repeat
c:= ReadKe c := ReadKey
until(c in [#6, #16, #19]); until(c in [^F, ^P, ^S]);
case c of (Ctrl+F, P и $) case c of (Ctrl+F, P и S)
... ...
end; {case} end; {case}
Первый способ использует специальный синтаксис Турбо Паскаля.
Второй способ основан на том, что можно коды, связанные с алфавитом, изображать как “K, где” — знак «стрелка вверх, а К — клавиша с соответствующим порядковым номером символа.
Таблица 21.1
Клавиша | Нормальное нажатие | +SHIFT | +CTRL | +ALT |
A | 65 | 97 | 1 | 0 30 |
B | 66 | 98 | 2 | 0 48 |
C | 67 | 99 | 3 | 0 46 |
D | 68 | 100 | 4 | 0 32 |
E | 69 | 101 | 5 | 0 18 |
- 497 -
F | 70 | 102 | 6 | 0 33 |
G | 71 | 103 | 7 | 0 34 |
H | 72 | 104 | 8 | 0 35 |
I | 73 | 105 | 9 | 0 23 |
J | 74 | 106 | 10 | 0 36 |
K | 75 | 107 | 11 | 0 37 |
L | 76 | 108 | 12 | 0 38 |
M | 77 | 109 | 13 | 0 50 |
N | 78 | 110 | 14 | 0 49 |
O | 79 | 111 | 15 | 0 24 |
P | 80 | 112 | 16 | 0 25 |
Q | 81 | 113 | 17 | 0 16 |
R | 82 | 114 | 18 | 0 19 |
S | 83 | 115 | 19 | 0 31 |
T | 84 | 116 | 20 | 0 20 |
U | 85 | 117 | 21 | 0 22 |
V | 86 | 118 | 22 | 0 47 |
W | 87 | 119 | 23 | 0 17 |
X | 88 | 120 | 24 | 0 45 |
Y | 89 | 121 | 25 | 0 21 |
Z | 90 | 122 | 26 | 0 44 |
[{ | 91 | 123 | 27 | |
\| | 92 | 124 | 28 | |
]} | 93 | 125 | 29 | |
῾~ | 96 | 126 | ||
1! | 49 | 33 | 0 120 | |
2@ | 50 | 64 | 0 3 | 0 121 |
3# | 51 | 35 | 0 122 | |
4$ | 52 | 36 | 0 123 | |
5% | 53 | 37 | 0 124 | |
6^ | 54 | 94 | 30 | 0 125 |
7& | 55 | 38 | 0 126 | |
8* | 56 | 42 | 0 127 | |
9( | 57 | 40 | 0 128 | |
0) | 48 | 41 | 0 129 | |
-_ | 45 | 95 | 31 | 0 130 |
=+ | 61 | 43 | 0 131 | |
,< | 44 | 60 | ||
.> | 46 | 62 | ||
/? | 47 | 63 | ||
;: | 59 | 58 | ||
'” | 39 | 34 | ||
Влево | 0 75 | 52 | 0 115 | 4 |
Вправо | 0 77 | 54 | 0 116 | 6 |
- 498 -
Вверх | 0 72 | 56 | 8 | |
Вниз | 0 80 | 50 | 2 | |
Home | 0 71 | 55 | 0 119 | 7 |
End | 0 79 | 49 | 0 117 | 1 |
PgUp | 0 73 | 57 | 0 132 | 9 |
PgDn | 0 81 | 51 | 0 118 | 3 |
Ins | 0 82 | 48 | ||
Del | 0 83 | 46 | ||
Esc | 27 | 27 | 27 | |
BackSpace | 8 | 8 | 127 | |
Tab | 9 | 0 15 | ||
Серая / | 47 | 47 | ||
Серая * | 42 | 42 | ||
Серая - | 45 | 45 | ||
Серая + | 43 | 43 | ||
Enter | 13 | 13 | 10 | |
Пробел | 32 | 32 | 32 | 32 |
F1 | 0 59 | 0 84 | 0 94 | 0 104 |
F2 | 0 60 | 0 85 | 0 95 | 0 105 |
F3 | 0 61 | 0 86 | 0 96 | 0 106 |
F4 | 0 62 | 0 87 | 0 97 | 0 107 |
F5 | 0 63 | 0 88 | 0 98 | 0 108 |
F6 | 0 64 | 0 89 | 0 99 | 0 109 |
F7 | 0 65 | 0 90 | 0 100 | 0 110 |
F8 | 0 66 | 0 91 | 0 101 | 0 111 |
F9 | 0 67 | 0 92 | 0 102 | 0 112 |
F10 | 0 68 | 0 93 | 0 103 | 0 113 |
F11 | 0 133 | 0 135 | 0 137 | 0 139 |
F12 | 0 134 | 0 136 | 0 138 | 0 140 |
Некоторые служебные и цифровые клавиши могут иметь иные коды на разных ПЭВМ.
Есть еще один способ — перечислить в множестве конструкции Chr(6), Chr(16), Chr(19) и т.п., но это будет слишком громоздко (хотя только через функцию Chr можно реализовать переменные значения символов в множествах).
Полный набор управляющих символов состоит из 32 наименований с кодами от 0 до 31 включительно. Не попавшие в диапазон 1..26 коды, однако, тоже могут быть получены аналогичным образом. Некоторые из цифровых клавиш, расположенных сразу над алфавитными, и знаков пунктуации в сочетании с регистром Ctrl дают недостающие коды (см. табл. 21.1). Хотя, признаться, авторы плохо представляют себе, где и как можно использовать такие «неуклюжие»
- 499 -
запросы, как Ctrl и клавиша «-» (код 31) или Ctrl+6 (код 30). Исключение составляет код 0. Он является чисто внутренним, и никакой комбинацией клавиш нельзя получить его в чистом виде.
Тот, кто просмотрит весь столбец «Ctrl» табл. 21.1, возможно, согласится с расстановкой кодов после буквы «Z» по принципу «максимального беспорядка». И, вероятно, понятное недоумение вызовут коды из двух цифр. Они описаны в следующем разделе.
21.3. Опрос расширенных кодов и функциональных клавиш