Събития на клавиатурата, заедно с събития с мишка, са основните елементи на взаимодействието на потребителя с вашата програма.
По-долу е информация за три събития, които ви позволяват да улавяте натискания на потребителя в приложение на Delphi: OnKeyDown, OnKeyUp и OnKeyPress.
Надолу, нагоре, натиснете, надолу, нагоре, натиснете...
Приложенията на Delphi могат да използват два метода за получаване на вход от клавиатурата. Ако потребителят трябва да въведе нещо в приложение, най-лесният начин да получи този вход е да използва един от контролите, който автоматично реагира на натискане на клавиши, като например Редактиране.
В други моменти и за по-общи цели обаче можем да създадем процедури във форма, която обработва три събития, разпознати по форми и от всеки компонент, който приема въвеждането на клавиатурата. Можем да напишем обработващи събития за тези събития, за да отговорим на всяка комбинация от клавиши или клавиши, които потребителят може да натисне по време на изпълнение.
Ето тези събития:
OnKeyDown - извиква се при натискане на който и да е клавиш от клавиатурата
OnKeyUp - извиква се при освобождаване на който и да е клавиш от клавиатурата
OnKeyPress - извиква се, когато се натисне клавиш, съответстващ на ASCII символ
Манипулатори за клавиатура
Всички клавиатурни събития имат такова параметър общо. Най- ключ параметърът е клавишът на клавиатурата и се използва за преминаване чрез стойността на натиснатия клавиш. Най- изместване параметър (в OnKeyDown и OnKeyUp процедури) показва дали клавишите Shift, Alt или Ctrl са комбинирани с натискането на клавиша.
Най- Изпращащ параметър препраща контрола, който е използван за извикване на метода.
процедура TForm1.FormKeyDown (Подател: TObject; Var Ключ: Word; Shift: TShiftState);... процедура TForm1.FormKeyUp (Подател: TObject; Var Ключ: Word; Shift: TShiftState);... процедура TForm1.FormKeyPress (Подател: TObject; Var Ключ: Char);
Отговарянето, когато потребителят натисне клавиши за бърз достъп или ускорител, като тези, предоставени с команди от менюто, не изисква писане на обработващи събития.
Какво е фокус?
Фокусът е възможността за получаване на потребителски вход чрез мишка или клавиатура. Само обектът, който има фокуса, може да получи събитие от клавиатурата. Също така, само един компонент на формуляр може да бъде активен или да има фокус в работещо приложение във всеки един момент.
Някои компоненти, като например TImage, TPaintBox, TPanel и TLabel не може да получи фокус. Като цяло, компоненти, получени от TGraphicControl не са в състояние да получат фокус. Освен това, компоненти, които са невидими по време на изпълнение (TTimer) не може да получи фокус.
OnKeyDown, OnKeyUp
Най- OnKeyDown и OnKeyUp събитията осигуряват най-ниското ниво на реакция на клавиатурата. И двете OnKeyDown и OnKeyUp манипулаторите могат да отговорят на всички клавиатурни клавиши, включително функционални клавиши и клавиши, комбинирани с изместване, Alt, и Ctrl ключове.
Събитията на клавиатурата не са взаимно изключващи се. Когато потребителят натисне клавиш, и двете OnKeyDown и OnKeyPress събития се генерират и когато потребителят пусне ключа, OnKeyUp събитие се генерира. Когато потребителят натисне един от клавишите, който OnKeyPress не открива, само OnKeyDown случва се събитие, последвано от OnKeyUp събитие.
Ако задържите клавиш, OnKeyUp събитие се случва в края на краищата OnKeyDown и OnKeyPress настъпили са събития.
OnKeyPress
OnKeyPress връща различен ASCII символ за 'g' и 'G', но OnKeyDown и OnKeyUp не прави разлика между главни и малки букви алфа.
Параметри на ключ и смяна
От времето на ключ параметър се предава чрез препратка, обработващият събитието може да се промени ключ така че приложението вижда различен ключ като участващ в събитието. Това е начин за ограничаване на видовете символи, които потребителят може да въвежда, като например, за да попречи на потребителите да въвеждат алфа бутони.
ако ключ в ['a'.. 'z'] + ['A'.. 'Z'] тогава Ключ: = # 0
Горното изявление проверява дали ключ параметърът е в обединението на два набора: малки букви (т.е. а през Z) и главни букви (A-Z). Ако е така, операторът присвоява стойността на символа от нула до ключ за да се предотврати всяко въвеждане в редактиране компонент, например, когато получи модифицирания ключ.
За небуквено-цифрови клавиши, WinAPI виртуални ключови кодове може да се използва за определяне на натиснатия клавиш. Windows определя специални константи за всеки клавиш, който потребителят може да натисне. Например, VK_RIGHT е кодът на виртуалния ключ за клавиша за дясна стрелка.
За да получите състоянието на ключовете на някои специални клавиши като РАЗДЕЛ или Страница нагоре, можем да използваме GetKeyState Обаждане в API на Windows. Състоянието на клавиша определя дали клавишът е нагоре, надолу или превключен (включен или изключен - редуващ се всеки път, когато клавишът е натиснат).
ако HiWord (GetKeyState (vk_PageUp)) <> 0 тогава
ShowMessage („PageUp - DOWN“)
още
ShowMessage ('PageUp - UP');
В OnKeyDown и OnKeyUp събития, ключ е неподписана стойност на Word, която представлява виртуален ключ на Windows. За да получите стойността на знака от ключ, ние използваме Chr функция. В OnKeyPress събитие, ключ е овъглявам стойност, която представлява ASCII символ.
И двете OnKeyDown и OnKeyUp събитията използват параметъра Shift от типа TShiftState, набор флагове за определяне състоянието на клавишите Alt, Ctrl и Shift при натискане на клавиш.
Например, когато натиснете Ctrl + A, се генерират следните ключови събития:
KeyDown (Ctrl) // ssCtrl
KeyDown (Ctrl + A) // ssCtrl + 'A'KeyPress (A) KeyUp (Ctrl + A)
Пренасочване на събитията от клавиатурата към формата
За да задържате натискания на клавиши на ниво формуляр, вместо да ги предавате на компонентите на формата, задайте формулярите KeyPreview свойство на True (използвайки Инспектор на обекта). Компонентът все още вижда събитието, но формулярът има възможност първо да се справи - да разреши или забрани например да бъдат натиснати някои клавиши.
Да предположим, че имате няколко редактиращи компоненти във формуляр и Форма. OnKeyPress процедурата изглежда така:
процедураTForm1.OrmKeyPress (подател: TObject; Var Ключ: Char); започвамако ключ в ['0'..'9'] тогава Ключ: = # 0. край;
Ако някой от компонентите за редактиране има Focus, и на KeyPreview свойството на формуляр е False, този код няма да се изпълни. С други думи, ако потребителят натисне 5 ключ, 5 ще се появи в фокусирания компонент Edit.
Въпреки това, ако KeyPreview е зададено на True, след това на формата OnKeyPress събитието се изпълнява преди компонента Edit да види бутона, който е натиснат. Отново, ако потребителят е натиснал 5 клавиш, след това тя присвоява стойност на нула на Key за предотвратяване на цифрово въвеждане в компонента Edit.