коды кнопок клавиатуры delphi
Коды клавиш Delphi
Таблица кодов клавиш, которыми можно пользоваться при проверке параметра Key в обработчиках событий OnKeyDown и OnKeyUp :
Клавиша
число
Шест.
число
Символическое
Сравнение по
функции ord
Правая клавиатура при выключенной клавише NumLock:
Коды виртуальных клавиш
Нижеследующая таблица показывает названия именованных констант, шестнадцатеричные значения, и эквиваленты мыши или клавиатуры для кодов виртуальных клавиш, используемых системой. Коды перечисляются в нарастающем порядке.
Windows 2000/XP: для американской стандартной клавиатуры это клавиша ‘;:’.
Windows 2000/XP: для американской стандартной клавиатуры это клавиша ‘/?’.
Windows 2000/XP: для американской стандартной клавиатуры это клавиша ‘`
Коды кнопок клавиатуры delphi
На сколько мне известно, у клавиш как пробел, enter и т.п., а так же вроде и у букв в Delphi есть коды(#n, n-номер). Где их можно найти. Меня в данном случае интересует пробел(как можно определить
нажатие пробела например в OnKeyPress if Key=#код нажатия на пробел then. ), но хорошо бы и знать другие коды. Где их можно найти?
← →
Джо © ( 2006-08-17 21:37 ) [1]
> Где их можно найти?
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage (IntToStr(Ord(Key)))
end;
Net, ja imeju vvidu, naprimer, nazhat enter, ja ze ne napishu v OnKeyPress «if key=Enter then. «, eto zhe budet Undeclared identifier, a kak togda, vo chto ja imeju vvidu.
> [3] Alral © (17.08.06 21:42)
> Net, ja imeju vvidu, naprimer, nazhat enter, ja ze ne napishu
> v OnKeyPress «if key=Enter then. «, eto zhe budet Undeclared
> identifier, a kak togda, vo chto ja imeju vvidu.
Код, приведенный в посте [1] и предназначен для того, чтобы узнать искомый код нажимаемой клавиши.
А как сеняются коды клавишь, когда они нажимаются вместе с шифтом или контролом или альтом?
← →
Джо © ( 2006-08-17 23:40 ) [7]
> [6] Галинка © (17.08.06 23:25)
> А как сеняются
А что это? 🙂
Извините, меняются конечно )))
Галинка © (17.08.06 23:25) [6]
> для Shift (и CapsLock) цифр и символов
для Shift (и CapsLock) при нажатии клавиш, соответствующих цифрам и символам
> Коды клавиш
case Key of
VK_CANCEL: tempstr := «CANCEL»;
VK_BACK: tempstr := «BACKSPACE»;
VK_TAB: tempstr := «TAB»;
VK_CLEAR: tempstr := «CLEAR»;
VK_RETURN: tempstr := «ENTER»;
VK_PAUSE: tempstr := «PAUSE»;
VK_CAPITAL: tempstr := «CAPS LOCK»;
VK_ESCAPE: tempstr := «ESC»;
VK_SPACE: tempstr := «SPACEBAR»;
VK_PRIOR: tempstr := «PAGE UP»;
VK_NEXT: tempstr := «PAGE DOWN»;
VK_END: tempstr := «END»;
VK_HOME: tempstr := «HOME»;
VK_LEFT: tempstr := «LEFT ARROW»;
VK_UP: tempstr := «UP ARROW»;
VK_RIGHT: tempstr := «RIGHT ARROW»;
VK_DOWN: tempstr := «DOWN ARROW»;
VK_SELECT: tempstr := «SELECT»;
VK_EXECUTE: tempstr := «EXECUTE»;
VK_SNAPSHOT: tempstr := «PRINT SCREEN»;
VK_INSERT: tempstr := «INS»;
VK_DELETE: tempstr := «DEL»;
VK_HELP: tempstr := «HELP»;
Еще раз. Что я должна видеть? Ну, например, набираю я шоткат Alt+E (обычно выход из программы). Какой код будет сгененрирован?
> вместе с шифтом или контролом или альтом?
if (ssCtrl in Shift) and (key=. ) then.
Короче. бардак. а как сама среда их распознает? Может поэтому их внешне и нельзя распознать, чтобы особо умные не переопределяли?
Никакого бардака.
В keydown»е код нажатой клавише, в keypress»е символ, если конечно это символ.
Символ зависит еще и от текущего языка, статуса shift и capslock. Естесственно его не может быть в keydown.
в [14] показано, как уотловить нажатие клавиши вместе с контролом
С контролом понятно. А с альтом?
← →
clickmaker © ( 2006-08-21 17:52 ) [21]
ЗЫ. Как здесь любят говорить «Я плякал»
Разобралась вроде. С контролом или альтом отлавливается код заглавной буквы латинского алфавита. Вне зависимости от выбранной раскладки клавиатуры. Т.е. это первый ASCII код, относящийся к нажатой клавише.
А как поймать нажатие функциональных клавишь F1-F12?
Ну звыняйте. Я уже два года с Дельфи не работала. Я вообще два года уже не работаю. Навыки однако теряются.
← →
clickmaker © ( 2006-08-21 18:30 ) [25]
> А как поймать нажатие функциональных клавишь F1-F12?
для проги нажатие Ф ничем не отличается от нажатия ентер
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
showmessage(inttostr(key));
end;
if (ssCtrl in Shift) and (key=. ) then.
Undeclared identifier «Shift».
> Alral © (22.08.06 20:21) [27]
> Undeclared identifier «Shift».
А причем тут OnKeyPress?
В оном есть только WM_CHAR.
> Alral © (22.08.06 20:21) [27]
Видимо, в этом (key=. ) оно и есть.
Da, v etom, a kakoi simvol dolzhen bit? Naprimer dlja T?
> Alral © (22.08.06 20:43) [30]
> Da, v etom, a kakoi simvol dolzhen bit? Naprimer dlja T?
← →
DprYg © ( 2006-08-22 20:55 ) [32]
if (ssCtrl in Shift) and ((Key = Ord(«T»)) then.
← →
Ketmar © ( 2006-08-22 20:56 ) [33]
> [16] Галинка © (21.08.06 12:31)
это где там «бардак»? это не «бардак», это незнание основ трансляции VK в коды символов. в частности того, что Alt+ не посылает сообщения WM_CHAR. оно посылает WM_SYSCHAR. следовательно, OnKeyPress() и не обязана на это реагировать.
> DprYg © (22.08.06 20:55) [32]
> if (ssCtrl in Shift) and ((Key = Ord(«T»)) then.
Да, конечно, Ord.
Sorry.
Ketmar © (22.08.06 20:56) [33]
я уже в принципе разобралась, что не бардак. Я не разобралась пока только, как отловить, например, Ctrl+F2, ну т.е. альта/контрола с функциональными клавишами.
← →
Ketmar © ( 2006-08-22 23:12 ) [36]
> [35] Галинка © (22.08.06 22:59)
RegisterHotKey() не пойдёт?
← →
Ketmar © ( 2006-08-22 23:13 ) [37]
да, извиняюсь. конечно же, после alt+ водникают UP и DOWN, который потом TranslateMessage() обарбатывает. %-)
← →
Ketmar © ( 2006-08-22 23:14 ) [38]
Коды кнопок клавиатуры delphi
При проектировании приложения необходимо предусмотреть удобную для пользователя последовательность фокусировки элементов.
Желательно, чтобы фокус автоматически переключался с одного компонента на другой в оптимальной последовательности при нажатии пользователем клавиши Enter после окончания работы с компонентом. Следует также предоставить пользователю возможность переключать фокус с помощью клавиши Табуляции. Очевидно, что с помощью мыши пользователь также имеет возможность переключать фокус.
В процессе выполнения это свойство меняется.
Во время проектирования можно установить последовательность фокусировки с помощью Табуляции.
Для задания последовательности табуляции проще всего воспользоваться командой Edit | Tab Order и в режиме диалога задать необходимую последовательность.
Как реализовать переключение фокуса на другой компонент после нажатия клавиши Enter рассмотрим после того, как разберемся с событиями, возникающими при работе с мышью и клавиатурой.
Все действия пользователя при взаимодействии с приложением сводятся к перемещению мыши, нажатию кнопок мыши и нажатию клавиш клавиатуры. Поэтому важно понимать, что происходит при этих манипуляциях пользователя.
Обработка событий мыши
В компонентах Delphi определен ряд событий, связанных с мышью. Основные из них:
Щелчок мыши на компоненте и некоторые другие действия пользователя
Двойной щелчок мыши на компоненте.
Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.
Перемещении курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.
Отпускание ранее нажатой кнопки мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.
Событие в момент получения элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса.
Событие в момент потери элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса.
Наиболее широко используется событие OnClick. Обычно оно наступает, если пользователь щелкнул на компоненте, т.е. нажал и отпустил кнопку мыши, когда указатель мыши находился на компоненте. Но это событие происходит также и при некоторых других действиях пользователя. Оно наступает, если:
• Пользователь выбрал элемент в сетке, дереве, списке, выпадающем списке, нажав клавишу со стрелкой.
• Пользователь нажал клавишу пробела, когда кнопка или индикатор были в фокусе.
• Пользователь нажал клавишу Enter, а активная форма имеет кнопку по умолчанию, указанную свойством Default.
• Пользователь нажал клавишу Esc, а активная форма имеет кнопку прерывания, указанную свойством Cancel.
• Пользователь нажал клавиши быстрого доступа к кнопке или индикатору. Например, если свойство Caption индикатора записано как ‘&Попужирный’ и символ ‘П’ подчеркнут, то нажатие пользователем комбинации клавиш Alt+П вызовет событие OnClick в этом индикаторе.
• Приложение установило в true свойство Checked радиокнопки RadioButton.
• Приложение изменило свойсто Checked индикатора Check-Box.
• Вызван метод Click элемента меню.
Для формы событие OnClick наступает, если пользователь щелкнул на пустом месте формы или на недоступном компоненте.
Необходимо четко представлять последовательность отдельных событий, наступающих при том или ином действии пользователя. Рассмотрим эти последовательности.
Каждое действие пользователя, связанное с нажатием или отпусканием кнопки мыши, приводит к серии последовательно наступающих событий.
Например, рассмотрим простейшее действие пользователя: переключение с помощью мыши фокуса с одного элемента на другой. Последовательность событий мыши в этом случае приведена в таблице
Перемещение курсора мыши в пределах первого компонента
Множество событий OnMouseMove в первом компоненте
Перемещение курсора мыши в пределах формы
Множество событий OnMouseMove в форме
Перемещение курсора мыши в пределах второго компонента
Множество событий OnMouseMove во втором компоненте
Нажатие кнопки мыши
OnExit в первом компоненте
OnEnter во втором компоненте
OnMouseDown во втором компоненте
Отпускание кнопки мыши
OnClick во втором компоненте
OnMouseUp во втором компоненте
События OnMouseMove происходят постоянно в процессе перемещения курсора мыши и даже просто при его дрожании, неизбежном, если пользователь не снимает руки с мыши. Это надо учитывать, и пользоваться этим событием очень осторожно, поскольку оно, в отличие от других, происходит многократно.
В обработчиках событий OnMouseDown и OnMouseUp можно распознать, какая кнопка мыши нажата и в какой точке компонента находится в данный момент курсор мыши.
Если щелчок делается на объекте, который уже находится в этот момент в фокусе, то не происходят события OnExit и OnEnter. В этом случае при нажатии кнопки наступает только событие OnMouseDown, а при отпускании кнопки — события OnClick и OnMouseUp.
Теперь рассмотрим последовательность событий при двойном щелчке на компоненте.
Первое нажатие кнопки мыши
OnMouseDown. Возможно распознавание нажатой кнопки и координат курсора мыши
Первое отпускание кнопки мыши
OnMouseUp. Возможно распознавание нажатой кнопки и координат курсора мьгпГи
Второе нажатие кнопки мыши
OnMouseDown. Возможно распознавание нажатой кнопки и координат курсора мыши
Второе отпускание кнопки мыши
OnMouseUp. Возможно распознавание нажатой кнопки и координат курсора мыши.
Распознавать нажатую кнопку мыши по-прежнему можно только в событиях OnMouseDown и OnMouseUp. Если же надо распознать именно двойной щелчок какой-то определенной кнопкой мыши, то можно, например, ввести некую переменную, являющуюся флагом двойного щелчка, устанавливать этот флаг в обработчике события OnDblClick, а в обработчиках событий OnMouseDown или OnMouseUp проверять этот флаг и, если он установлен, то сбрасывать его и выполнять запланированные действия.
Распознавание источника события,
нажатых кнопок и клавиш, координат курсора
Распознавание источника события
Во все обработчики событий, связанных с манипуляциями мыши (как и во все другие обработчики), передается параметр Sender типа TObject. Этот параметр содержит указатель на компонент, в котором произошло событие. Он не требуется, если пишется обработчик события для одного конкретного компонента. Однако часто один обработчик применяется для нескольких компонентов. При этом какие-то операции могут быть общими для любых источников события, а какие-то требовать специфических действий. Тогда Sender можно использовать для распознавания источника события. Правда, поскольку тип TObject не имеет никаких полезных для пользователя свойств и методов, то объект Sender следует рассматривать как объект одного из производных от TObject типов.
Если необходимо распознать только тип объекта, можно использовать операцию is.
так можно проверить, является ли источник события компонентом типа TListBox.
Если требуется распознать объект по имени или другому свойству, можно использовать операцию as.
так можно проверить, является ли этот компонент компонентом с именем Edit1.
В данном случае можно было бы просто определить, не является ли Sender объектом Edit1:
Операцию as можно также использовать, если надо применить к источнику события некоторый метод.
увеличивает на 10% размер любого оконного компонента, в котором произошло обрабатываемое событие.
Распознавание нажатых кнопок
Помимо параметра Sender в обработчики событий OnMouseDown и OnMouseUp передаются параметры, позволяющие распознать нажатую кнопку, нажатые при этом вспомогательные клавиши, а также определить координаты курсора мыши. Заголовок обработчика события OnMouseDown или OnMouseUp может иметь, например, следующий вид:
Shift: TShiftState; X, Y: Integer);
Параметр Button определяет нажатую в этот момент кнопку мыши.
Тип TMouseButton — перечислимый тип, определяемый следующим образом:
TMouseButton = (mbLeft, mbRight, mbMiddle) ;
Например, если необходимо, чтобы обработчик реагировал на нажатие только левой кнопки, можно написать: if (Button <> mbLeft) then exit;
Параметр Shift определяет, какие вспомогательные клавиши на клавиатуре нажаты в момент нажатия кнопки мыши.
Тип TShiftState — множество, определенное следующим образом:
TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble) ;
Элементы этого множества соответствуют нажатию клавиш Shift (ssShift), Alt (ssAlt), Ctrl (ssCtrl), а также кнопок: левой (ssLeft), правой (ssRight), средней (ssMiddle).
Информация о нажатых кнопках в параметрах Button и Shift имеет различный смысл.
Параметр Button соответствует кнопке, нажимаемой в данный момент, а параметр Shift содержит информацию о том, какие кнопки были нажаты, включая и те, которые были нажаты ранее.
Например, если пользователь нажмет левую кнопку мыши, а затем, не отпуская ее, нажмет правую, то после первого нажатия множество Shift будет равно [ssLeft], а после второго — [ssLeft, ssRight]. Если до этого пользователь нажал и не отпустил какие-то вспомогательные клавиши, то информация о них также будет присутствовать в множестве Shift.
Так как Shift является множеством, проверять наличие в нем тех или иных элементов надо операцией in.
Например, если необходимо прореагировать на событие, заключающееся в нажатии левой кнопки мыши при нажатой клавише Alt, можно использовать оператор:
Замечание. Здесь условие (Button = mbLeft) можно заменить эквивалентным ему условием
Аналогичные параметры Button и Shift передаются и в обработчик события OnMouseUp. Отличие только в том, что параметр Button соответствует не нажимаемой в данный момент, а отпускаемой кнопке. Параметр Shift передается также в обработчик события OnMouseMove, так что и в этом обработчике можно определить, какие клавиши и кнопки нажаты.
Распознавание координат курсора
Во все события, связанные с мышью, передаются также координаты курсора Х и Y.
Эти параметры определяют координаты курсора в клиентской области компонента. Благодаря этому можно обеспечить различную реакцию в зависимости от того, в какой части клиентской области расположен курсор.
В событие OnMouseDown компонента (формы) можно ввести обработчик, в котором можно анализировать координаты курсора, например
В оконных компонентах Delphi определены три события, связанные с клавиатурой.
Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ нажатой клавиши
Можно распознать нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши и кнопки
Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ отпускаемой клавиши
Кроме того, при нажатии пользователем клавиши табуляции фокус может переключаться с элемента на элемент, что вызывает события OnEnter и OnExit.
Важно четко представлять последовательность событий, происходящих при нажатии пользователем клавиши или комбинации клавиш.
Пусть, например, пользователь нажал клавишу Shift (перевел ввод в верхний регистр), а затем нажал клавишу символа “н”. Последовательность событий для этого случая приведена в таблице.
Нажатие клавиши Shift
OnKeyDown. Возможно распознавание нажатой клавиши Shift
OnKeyDown. Возможно распознавание нажатой клавиши Shift, нажатой клавиши “н”, но отличить верхний регистр от нижнего и латинский символ от русского невозможно
ОпКеу Press. Возможно распознавание символа с учетом регистра и языка, но невозможно распознавание нажатой клавиши Shift
Отпускание клавиши “н”
OnKeyUp. Возможно распознавание нажатой клавиши Shift, отпущенной клавиши “н”, но отличить верхний регистр от нижнего и латинский символ от русского невозможно
Отпускание клавиши Shift
OnKeyUp. Возможно распознавание отпущенной клавиши Shift
Замечание. Событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.
Куда поступают события клавиатуры?
У формы имеется свойство KeyPreview. Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойство KeyPreview = false и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значение KeyPreview = true, то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.
Распознавание нажатых клавиш
Заголовок обработчика события OnKeyDown может иметь, например, следующий вид:
Параметр Sender указывает на источник события
Параметр Shift, представляет множество элементов, отражающих нажатые в это время функциональные клавиши.
Здесь множество возможных элементов параметра Shift сокращено до ssShift (нажата клавиша Shift), ssAlt (нажата клавиша Alt) и ssCtrl (нажата клавиша Ctrl). Информация о нажатых кнопках мыши отсутствует.
Обратите внимание, что он определен как var, т.е. может изменяться в обработчике события. Обратите внимание, что это целое число, а не символ.
Параметр Key определяет нажатую в момент события клавишу клавиатуры.
Полную таблицу этих кодов можно посмотреть во встроенной справке Delphi. Ниже приведены для дальнейшего обсуждения только несколько строк из нее, соответствующих наиболее распространенным клавишам.
- С чем сделать слабительную клизму
- Мод TooManyItem для Майнкрафт