Лекция № 13
Тема: «Обработка событий клавиатуры и мыши»
План
1. События мыши и их параметры
2. События клавиатуры
3. Функции для работы с клавиатурой
4. Коды клавиш
1. События мыши и их параметры
В компонентах Delphi определен ряд событий, связанных с мышью. Приведем основные из них:
|
Событие |
Описание |
|
OnClick |
Щелчок мыши на компоненте и некоторые другие действия пользователя. |
|
OnDblClick |
Двойной щелчок мыши на компоненте. |
|
OnMouseDown |
Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши. |
|
OnMouseMove |
Перемещении курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши. |
|
OnMouseUp |
Отпускание прежде нажатой кнопки мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши. |
|
OnMouseWheel |
Событие при вращении колесика мыши в любую сторону |
|
OnMouseWheelUp |
Вращение колесика мыши вверх. Наступает, если вращение не обработано в событии OnMouseWheel |
|
OnMouseWheelDown |
Вращение колесика мыши вниз. Наступает, если вращение не обработано в событии OnMоuseWheel |
Событие OnMouseMove возникает при наведении мыши на компонент. Это событие можно использовать для создания "живого" интерфейса, когда компонент меняет свое оформление при наведении на него мышью.
Например. Пусть имеется поле Edit1. При наведении на него мышью фон поля меняется, а при наведении на форму – принимает исходный цвет.
В событии поля OnMouseMove напишем код:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
//устанавливаем цвет фона для поля
Edit1.Color:=clYellow;
end;
В событии формы OnMouseMove напишем код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
//возвращаем для поля начальный белый цвет
Edit1.Color:=clWhite;
end;
Это же событие можно использовать для информирования в строке статуса о назначении компонента, на который наведена мышь.
Например. Пусть имеется поле Edit1. При наведении на него мышью в строке статуса появляется текст "Текстовое поле", а при наведении на форму – текст исчезает.
В событии поля OnMouseMove напишем код:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
//в строке статуса отображаем текст
StatusBar1.SimpleText:='Текстовое поле';
end;
В событии формы OnMouseMove напишем код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
//в строке статуса очищаем текст
StatusBar1.SimpleText:='';
end;
В некоторые обработчики событий мыши передаются параметры Button, Shift, X и Y.
Пусть имеется список ListBox1. Если щелкнуть на нем Alt+левая кнопка мыши, то список очищается, если щелкнуть Crtl+левая кнопка мыши, то список меняет цвет фона, если щелкнуть Alt+Shift+правая кнопка мыши, то список скрывается с формы.
Обработчик можно написать в событии списка OnMouseDown или OnMouseUp.
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//если нажаты Alt+левая кнопка мыши
if (Button=mbLeft) and (ssAlt in Shift) then
ListBox1.Clear
//если нажаты Crtl+левая кнопка мыши
else if (Button=mbLeft) and (ssCtrl in Shift) then
ListBox1.Color:=clYellow
//если нажатые Alt+Ctrl+левая кнопка мыши
else if (Button=mbLeft) and (ssAlt in Shift) and (ssCtrl in Shift) then
Listbox1.Visible:=false;
end;
Большинство оконных компонентов – многострочные окна редактирования, списки и т.п. имеют обработчики вращений колесика мыши по умолчанию. Это относится к Memo, RichEdit, ListBox и многим другим, в том числе и к формам. Правда, в некоторых из них, например, в Memo, эти обработчики по умолчанию будут срабатывать только в том случае, если в компоненте заданно отображение полос прокрутки (то есть это обработчики не самых элементов, а полос прокрутки).
Обработчики по умолчанию обеспечивают при вращении колесика сдвиг содержимого в соответствующем направлении. Так что писать обработчики событий, связанных с колесиком, имеет смысл только в случаях, когда надо обеспечить нестандартную реакцию компонента. Например: с помощью колесика мыши обеспечить уменьшении формы при вращении колесика вниз, и увеличении формы при вращении колесика вверх.
В событии формы OnMouseWheelDown напишем код:
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
//уменьшаем ширину формы
form1.Width:=form1.Width-10;
//уменьшаем высоту формы
form1.Height:=form1.Height-10;
end;
В событии формы OnMouseWheelUp напишем код:
procedure TForm1.FormMouseWheelUp(Sender: Tobject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
//увеличиваем ширину формы
form1.Width:=form1.Width+10;
//увеличиваем высоту формы
form1.Height:=form1.Height+10;
end;
При таком подходе необходимо, чтобы форма имела ограничение на минимальные и максимальные значения ширины и высоты (свойство формы Constraints). А если нет, то форма может уменьшаться до заголовка, а увеличиваться за границы окна.
Перетаскивание информации
Код перетаскивания нужно писать в событии OnMouseDown компонента, который перетаскивается. Сам код имеет вид:
ReleaseCapture();
(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);
Код является универсальным и может использоваться для любого компонента. Например: организуем перетаскивание кнопки по форме с помощью комбинации Alt+левая кнопка мыши.
В событии кнопки OnMouseDown напишем код:
if (Button=mbLeft) and (ssAlt in Shift) then
begin
ReleaseCapture();
(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);
end;
Например: организовать перетаскивание формы по экрану за любое свободное место на ней.
В событии формы OnMouseDown напишем код:
if (Button=mbLeft) and (ssAlt in Shift) then
begin
ReleaseCapture();
(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);
end;
2. События клавиатуры
В компонентах Delphi определено три события, связанных с клавиатурой. Это события:
|
Событие |
Описание |
|
OnKeyDown |
Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ нажатой клавиши. |
|
OnKeyPress |
Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши. |
|
OnKeyUp |
Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ клавиши, которая отпускается. |
По умолчанию форма не реагирует на нажатие клавиш. Даже, если написать обработчики для нужных событий, то они не будут работать, пока не установить для формы свойство KeyPreview=true.
События OnKeyUp и OnKeyDown имеют одинаковые параметры:
Параметр Key является целым числом, определяющим клавишу, а не символ. Например, один и тот же код соответствует прописному и строчному символам "Y" и "y". Если, как это обычно бывает, в русской клавиатуре этой клавише соответствуют символы кириллицы "Н" и "н", то их код будет тем же самым. Различить прописные и строчные символы или символы латинские и кириллицы невозможно.
Проверять нажатую клавишу можно, сравнивая Key с целым десятичным кодом клавиши, приведенном во втором столбце справочной таблицы. Например, реакцию на нажатие пользователем клавиши Enter можно оформить оператором:
if (Key = 13) then . . . ;
Можно сравнивать Key и с шестнадцатиричным эквивалентом кода, приведенным в третьем столбце справочной таблицы. Например, приведенный выше оператор можно записать в виде:
if (Key = $0D) then . . .;
Для клавиш, которым не соответствуют символы, назначены также именованные константы, которые облегчают написание программы, поскольку не требуют помнить числовые коды клавиш. Например, приведенный выше оператор можно записать в виде:
if (Key = VK_RETURN) then . . .;
Для клавиш символов и цифр можно делать проверку сравнением с десятичным или шестнадцатилетним кодом, но это не очень удобно, потому что тяжело помнить коды разных символов. Другой способ – воспользоваться функцией Ord, которая определяет код символа. Коды латинских символов в верхнем регистре совпадают с виртуальными кодами, используемыми в параметре Key. Поэтому, например, если вы хотите распознать клавишу, соответствующую символу "Y", вы можете написать:
if (key = Ord('Y') then . . . ;
В этом операторе можно использовать только латинские символы в верхнем регистре. Если вы напишете ОRD('y') или захотите написать русские символы, соответствующие этой клавише – ORD('H') или Ord('н'), то оператор на сработает.
Приведем пример распознавания комбинации клавиш. Пусть вы хотите, например, распознать комбинацию Alt+X, Для этого вы можете написать оператор:
if (Key = Ord('X')) and (ssAlt in Shift) then . . . ;
Мы рассмотрели распознавание клавиш в события OnKeyDown. Заголовок обработчика события OnKeyUp имеет такой же вид, так что все сказанное в равной мере относится и к событиям при отпускании клавиш.
Рассмотренные события можно использовать для присваивания «горячих» клавиша для доступа к элементам на форме.
Пример. Пусть на форме есть два переключателя (RadioButton1 и RadioButton2). Написать код, который переключает эти элементы с помощью комбинаций Alt+F1 и Alt+F2.
В событии формы OnKeyDown напишем код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если нажаты Alt+F1
if (Key=VK_F1) and (ssAlt in Shift) then
//включаем первый переключатель
RadioButton1.Checked:=true
//если нажаты Alt+F2
else if (Key=VK_F2) and (ssAlt in Shift) then
//включаем второй переключатель
RadioButton2.Checked:=true
end;
Пример. Пусть на форме имеется фляжок CheckBox1. Написать код, который переключает флажок с помощью комбинации Ctrl+1.
В событии формы OnKeyDown напишем код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если нажата комбинации Ctrl+1
if (Key=ord('1')) and (ssCtrl in Shift) then
//флажок переводится в противоположное состояние
CheckBox1.Checked:=not CheckBox1.Checked;
end;
Событие OnKeyPress
Теперь перейдем к рассмотрению события OnKeyPress. В этот обработчик, как и в описанные выше, передается параметр Key, но это не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква, или строчная, русская, или латинская.
Пусть, например, вы задали пользователю вопроса, на который он должен ответить символами "Д" или "д" (да), или символами "Н" или "н" (нет). Тогда распознать утвердительный ответ в обработчике события OnKeyPress можно оператором:
if ((Key= 'Д') or (Key='д')) then . . .
. . .
else if ((Key= 'Н') or (Key='н')) then . . .
. . . ;
Этот же пример можно реализовать с помощью оператора case.
case key of
'Д', 'д': . . . ;
'Н', 'н': . . . ;
else
windows.beep(150,250);
end;
Здесь предусмотренная реакция на положительный и отрицательный ответ, а также звуковой сигнал при ошибочном ответе.
Если программа может распознать нажатый символ, то можно создавать код, который будет фильтровать вводимую информацию, защищая программу от ошибок ввода.
Пример. Пусть имеется текстовое поле Edit1. Необходимо, чтобы в поле можно было ввести только русские буквы, пробел и тире.
Для наложения такого ограничения нужно в событии OnKeyPress поля ввести код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['А'..'я','-']) then
begin
Key:=#0;
windows.beep(150,250);
end
end;
Если введенный символ не русская буква и не тире, то этот символ заменяется на пустой и не отображается в поле.
Пример. Пусть в поле Edit1 нужно разрешить вводить буквы на двух алфавитах. Диапазон запрещенных символов нужно изменить
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['A'..'я','А'..'я', '-']) then
begin
key:=#0;
windows.beep(150,250);
end
end;
Пример. Иногда нужно не только ограничить ввод только буквами, но и сделать так, чтобы буквы, которые вводятся, автоматически заменялись на прописные или строчные. В этом случае рассмотренный раньше фрагмент кода можно дополнить так:
// для замены текста на прописные буквы
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
if not (Key in ['А'..'я','-']) then
begin
Key:=#0;
windows.beep(150,250);
end
else
begin
s:=Key;
Key:=AnsiUpperCase(s)[1];
end;
end;
// для замены текста на строчные буквы
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
if not (Key in ['А'..'я','-']) then
begin
Key:=#0;
windows.beep(150,250);
end
else
begin
s:=Key;
Key:=AnsiLowerCase(s)[1];
end;
end;
Пример. Если в поле нужно ограничить ввод только цифрами, десятичной точкой, и знаком числа "-", то код может иметь вид:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var ch:char;
begin
//записываем в переменную принятый в ОС разделитель
ch=DecimalSeparator;
//если введенная точка или запятая,
//то ее заменяем на разделитель, принятый в ОС пользователя
if (Key='.') or (Key=',') then
Key:=ch;
//если символ не цифра, не разделитель, не минус и не BackSpace
if not (Key in ['0'..'9',ch,'-',#8])
//или, если разделитель уже введен
or ((Key=ch)and(Pos(ch,Edit1.Text)>0))
//или, если минус уже введен
or ((Key='-')and(Pos('-',Edit1.Text)>0))
//или, если введенный минус не в начале числа
or ((Key='-')and(Edit1.SelStart>0)) then
begin
Key:=#0;
windows.beep(150,250);
end
end;
В этом примере используется функция Pos(s1,s2). Данная функция ищет вхождение строки s1 в строку s2. Если строка найдена, то функция равняется номеру символа, с которого начинается вхождение. Если строка не найдена, то функция равная 0.
Например:
var s2:string;
. . .
begin
. . .
s2:=’информатика’;
Pos(‘форма’, s2) = 3
Pos(‘пример’, s2) = 0
В последнем условии используется свойство текстового поля SelStart, в котором хранится положения курсора в поле (нумерация с 0). Поэтому, если SelStart не 0, то это означает, что мы вводим символ "-" не в первой позиции, что недопустимо для числа.
3.Функции для работы с клавиатурой
Изменение языка при входе в поле
Для облегчения работы пользователя с программой можно предусмотреть автоматическое переключение языка клавиатуры при входе в поле или при запуске программы. В первом случае код нужно писать для события OnEnter текстового поля. Это событие наступает при получении полем фокуса. Во второму случае код нужно писать в событии OnCreate нужной формы. Сам код имеет вид (пример для события OnEnter):
procedure TForm1.Edit1Enter(Sender: TObject);
begin
//переключаем клавиатуру на русский язык
LoadKeyboardLayout('00000419',klf_activate);
end;
Для переключения на другие языки нужно в команде указать соответствующий код языка:
00000422 – украинский язык;
00000409 – английский язык;
0000040С – французский язык;
00000407 – немецкий язык.
Определение текущего языка клавиатуры
Для проверки текущего языка клавиатуры использую функцию вида:
if GetKeyboardLayout(0) = код языка then
где код языка может принимать значения:
67699721 - английский язык;
68748313 - украинский язык;
4039115810 - русский язык.
Пример. Пусть в строке статуса в первой панели нужно отображать текущий язык клавиатуры. В событии формы OnKeyDown напишем код:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если активный язык - английский
if GetKeyboardLayout(0) = 67699721 then
StatusBar1.Panels[0].Text:='EN'
//иначе, если активный язык - русский
else if GetKeyboardLayout(0) = 68748313 then
StatusBar1.Panels[0].Text:='RU'
//иначе, если активный язык - украинский
else if GetKeyboardLayout(0) = 4039115810 then
StatusBar1.Panels[0].Text:='UA'
end;
Распознавание состояния специальных клавиш
Стандартные события клавиатуры OnKeyDown, OnKeyUp и OnKeyPress имеют ограничения на распознавание нажатия клавиш. Например, они не могут распознать нажатие или отпускание клавиш CapsLock, NumLock, Insert, ScrollLock.
Для выполнения такого распознавания можно использовать функцию GetKeyState, которая записывается в виде:
if (GetKeyState (клавиша) and 1)=1 then
клавиши включена
else
клавиши выключена
Клавиша – это обозначение из таблицы кодов клавиш (см. следующий раздел лекции).
Пример. Пусть имеется строка статуса, которая состоит из 4 панелей. Нужно при каждом нажатии на клавишу CapsLock отображать в четвертой панели состояние этой клавиши: текст «CAPS» – если клавиши включена и пустой символ – если выключена. В событии формы OnKeyUp напишем код:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если клавиша включена
if (GetKeyState(VK_CAPITAL) and 1) = 1 then
//то отображаем текст в 4 панели (нумерация панелей начинается с 0)
Statusbar1.Panels[3].Text:='CAPS'
//иначе, если клавиша выключена
else
//удаляем текст из панели
Statusbar1.Panels[3].Text:=''
end;
Программное нажатие на клавише
Существует возможность программно эмулировать нажатие клавиш на клавиатуре. При этом компьютер обработает данное нажатие так же, как если бы клавишу нажал пользователь. Для реализации такой возможности всегда используют пару команд:
//нажатие клавиши
keybd_event (клавиша, MapVirtualKey(клавиша,0), 0, 0);
//отпускание клавиши
keybd_event (клавиша, MapVirtualKey(клавиша,0), keyeventf_keyup, 0);
Клавиша - это обозначения из таблицы кодов клавиш (см. следующий раздел лекции).
Пусть при открытии формы нужно включить клавишу NumLock, если она была выключена. Для этого в событии формы OnCreate напишем код:
procedure TForm1.FormCreate(Sender: TObject);
begin
//если клавиша выключена
if (GetKeyState(VK_NUMLOCK) and 1) = 0 then
begin
//нажимаем ее
keybd_event(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),0,0);
//и отпускаем
keybd_event(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),keyeventf_keyup,0);
end;
end;
Распознавание левой и правой специальной клавиши
Функция GetKeyState позволяет также распознать, которую именно из двух специальных клавиш нажал пользователь: левую или правую. Для этого используют оператор вида:
if GetKeyState (VK_LSHIFT)<>0 then
//нажат левый Shift
или
if GetKeyState (VK_RSHIFT)<>1 then
//нажат правый Shift
Пример. Пусть имеется два переключателя RadioButton1 и RadioButton2. Первый из них нужно включать комбинацией LeftAlt+1, а второй – RightAlt+1. Для этого в событии формы OnKeyDown напишем код:
procedure TForm1.FormKeydown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если нажата клавиша "1"
if key=ord('1') then
begin
//если нажат левый Alt
if (GetKeyState(VK_LMENU)<>0) then
//включаем первый переключатель
RadioButton1.Checked:=true
//если нажат правый Alt
else if (GetKeyState(VK_RMENU)<>1) then
//включаем второй переключатель
RadioButton2.Checked:=true ;
end;
end;
4. Коды клавиш
Ниже приведеные коды клавиш, которыми можно пользоваться при проверке параметра Key в обработчиках событий OnKeyDown и OnKeyUp, при записи строк и в ряде других случаев. Символы кириллицы отвечают тем клавишам с латинскими символами, на которые они размещены.
|
Клавиши |
Десятичное число |
Шестнадцатиричное число |
Символическое имя |
Сравнение по функции ord |
|
F1 |
112 |
$70 |
VK_F1 |
|
|
F2 |
113 |
$71 |
VK_F2 |
|
|
F3 |
114 |
$72 |
VK_F3 |
|
|
F4 |
115 |
$73 |
VK_F4 |
|
|
F5 |
116 |
$74 |
VK_F5 |
|
|
F6 |
117 |
$75 |
VK_F6 |
|
|
F7 |
118 |
$76 |
VK_F7 |
|
|
F8 |
119 |
$77 |
VK_F8 |
|
|
F9 |
120 |
$78 |
VK_F9 |
|
|
F10 |
121 |
$79 |
VK_F10 |
|
|
пробел |
32 |
$20 |
VK_SPACE |
|
|
Backspace |
8 |
$8 |
VK_BACK |
|
|
Тab |
9 |
$9 |
VK_TAB |
|
|
Enter |
13 |
$0D |
VK_RETURN |
|
|
Shift |
16 |
$10 |
VK_SHIFT |
|
|
Ctrl |
17 |
$11 |
VK_CONTROL |
|
|
Alt |
18 |
$12 |
VK_MENU |
|
|
CapsLock |
20 |
$14 |
VK_CAPITAL |
|
|
Esc |
27 |
$1В |
VK_ESCAPE |
|
|
Insert |
45 |
$2D |
VK_INSERT |
|
|
PageUp |
33 |
$21 |
VK_PRIOR |
|
|
PageDown |
34 |
$22 |
VK _NEXT |
|
|
End |
35 |
$23 |
VK_END |
|
|
Home |
36 |
$24 |
VK_HOME |
|
|
← |
37 |
$25 |
VK_LEFT |
|
|
↑ |
38 |
$26 |
VK_UP |
|
|
→ |
39 |
$27 |
VK_RIGHT |
|
|
↓ |
40 |
$28 |
VK_DOWN |
|
|
Delete |
46 |
$2Э |
VK_DELETE |
|
|
PrintScreen |
44 |
$2С |
VK_SNAPSHOT |
|
|
ScrollLock |
145 |
$91 |
VK_SCROLL |
|
|
Pause |
19 |
$13 |
VK_PAUSE |
|
|
NumLock |
144 |
$90 |
VK_NUMLOCK |
|
|
0, ) |
48 |
$30 |
|
ord(‘0’) |
|
1, ! |
49 |
$31 |
|
ord(‘1’) |
|
2, @ |
50 |
$32 |
|
ord(‘2’) |
|
3, # |
51 |
$33 |
|
ord(‘3’) |
|
4, $ |
52 |
$34 |
|
ord(‘4’) |
|
5, % |
53 |
$35 |
|
ord(‘5’) |
|
6, |
54 |
$36 |
|
ord(‘6’) |
|
7, & |
55 |
$37 |
|
ord(‘7’) |
|
8, * |
56 |
$38 |
|
ord(‘8’) |
|
9, ( |
57 |
$39 |
|
ord(‘9’) |
|
`, ~ |
192 |
$ С0 |
|
|
|
-, _ |
189 |
$BD |
|
|
|
=, + |
187 |
$ВВ |
|
|
|
[, { |
219 |
$DB |
|
|
|
], } |
221 |
$DD |
|
|
|
; : |
186 |
$ВА |
|
|
|
‘, “ |
222 |
$DE |
|
|
|
\, | |
220 |
$DC |
|
|
|
, < |
188 |
$ВР |
|
|
|
. > |
190 |
$ВE |
|
|
|
/, ? |
191 |
$BF |
|
|
|
а, А |
65 |
$41 |
|
ord('A') |
|
b,B |
66 |
$42 |
|
ord(B') |
|
c,C |
67 |
$43 |
|
ord(‘C’) |
|
d,D |
68 |
$44 |
|
ord('D') |
|
e,E |
69 |
$45 |
|
ord('E') |
|
f, F |
70 |
$46 |
|
ord('F') |
|
g, G |
71 |
$47 |
|
ord('G') |
|
h,H |
72 |
$48 |
|
ord('H') |
|
i, I |
73 |
$49 |
|
ord('I') |
|
j, J |
74 |
$4А |
|
ord(‘J’) |
|
k, K |
75 |
$4В |
|
ord('K') |
|
l, L |
76 |
$4С |
|
ord('L') |
|
m, M |
77 |
$4D |
|
ord(‘M’) |
|
n, N |
78 |
$4Э |
|
ord(‘N’) |
|
o, O |
79 |
$4F |
|
ord('O') |
|
p, P |
80 |
$50 |
|
ord('P') |
|
q, Q |
81 |
$51 |
|
ord('Q') |
|
r, R |
82 |
$52 |
|
ord('R') |
|
s, S |
83 |
$53 |
|
ord(‘S’) |
|
t, T |
84 |
$54 |
|
ord('T') |
|
u, U |
85 |
$55 |
|
ord('U') |
|
v, V |
86 |
$56 |
|
ord('V') |
|
w, W |
87 |
$57 |
|
ord('W') |
|
x, X |
88 |
$58 |
|
ord('X') |
|
y, Y |
89 |
$59 |
|
ord('Y') |
|
z, Z |
90 |
$5А |
|
ord(‘Z’) |
|
На правой клавиатуре при исключенной клавише NumLock |
||||
|
0 |
96 |
$60 |
VK_NUMPAD0 |
|
|
1 |
97 |
$61 |
VK_NUMPAD1 |
|
|
2 |
98 |
$62 |
VK_NUMPAD2 |
|
|
3 |
99 |
$63 |
VK_NUMPAD3 |
|
|
4 |
100 |
$64 |
VK_NUMPAB4 |
|
|
5 |
101 |
$65 |
VK_NUMPAD5 |
|
|
6 |
102 |
$66 |
VK_NUMPAD6 |
|
|
7 |
103 |
$67 |
VK_NUMPAD7 |
|
|
8 |
104 |
$68 |
VK_NUMPAD8 |
|
|
9 |
105 |
$69 |
VK_NUMPAD9 |
|
|
* |
106 |
$6А |
VK_MULTIPLY |
|
|
+ |
107 |
$6В |
VK_ADD |
|
|
- |
109 |
$6D |
VK_SUBTRACT |
|
|
. |
110 |
$6Э |
VK_DECIMAL |
|
|
/ |
111 |
$6F |
VK_DIVIDE |
|
Вопросы для самоконтроля
1. Опишите события OnMouseDown, OnMouseUp, OnMouseMove. Какие параметры имеют эти события?
2. Опишите события OnMouseWheelUp, OnMouseWheelDown.
3. Как выполнить перетаскивание формы по экрану за свободное место на ней?
4. Дайте характеристику событиям OnKeyDown, OnKeyUp. Какие параметры имеют эти события?
5. Какие способы определения нажатой клавиши вы знаете?
6. Дайте характеристику события OnKeyPress. Какой параметр она имеет?
7. Приведите код ограничения поля на ввода только целых чисел.
8. Приведите команду переключения языков на клавиатуре.
9. Как определить состояние специальных клавиш NumLock, CapsLock, Insert.
10. Приведите команды программного нажатия на клавишу.
11. Как распознать нажатие левой или правой специальной клавиши?