Förstå och bearbeta tangentbordshändelser i Delphi

Tangentbordshändelser, tillsammans med mushändelser, är de viktigaste delarna i en användares interaktion med ditt program.

Nedan finns information om tre händelser som låter dig fånga en användares tangenttryckningar i en Delphi-applikation: onKeyDown, onKeyUp och OnKeyPress.

Ner, Upp, Tryck, Ner, Upp, Tryck ...

Delphi-applikationer kan använda två metoder för att ta emot ingången från tangentbordet. Om en användare måste skriva något i ett program är det enklaste sättet att ta emot den inmatningen att använda en av kontrollerna som automatiskt svarar på knapptryckningar, till exempel Redigera.

Vid andra tillfällen och för mer allmänna ändamål kan vi emellertid skapa procedurer i en form som hanterar tre händelser som känns igen av formulär och av alla komponenter som accepterar tangentbordsinmatning. Vi kan skriva händelseshanterare för dessa händelser för att svara på valfri tangent eller tangentkombination som användaren kan trycka på vid körning.

Här är dessa händelser:

onKeyDown - kallas när någon knapp på tangentbordet trycks ned
onKeyUp - kallas när någon tangent på tangentbordet släpps
OnKeyPress - kallas när man trycker på en tangent som motsvarar ett ASCII-tecken

Tangentbordshanterare

Alla tangentbordshändelser har en gemensam parameter. De Nyckel parameter är tangenten på tangentbordet och används för att passera med referens till värdet på den tryckta tangenten. De Flytta parameter (i onKeyDown och onKeyUp procedurer) anger om Shift-, Alt- eller Ctrl-tangenterna kombineras med tangenttrycket.

Avsändarparametern refererar till kontrollen som användes för att anropa metoden.

 procedur TForm1.FormKeyDown (avsändare: TObject; var Nyckel: Word; Shift: TShiftState); ... procedur TForm1.FormKeyUp (avsändare: TObject; var Nyckel: Word; Shift: TShiftState); ... procedur TForm1.FormKeyPress (avsändare: TObject; var Nyckel: Char); 

Att svara när användaren trycker på genvägs- eller acceleratortangenter, till exempel de som är försedda med menykommandon, kräver inte att händelseshanterare skrivs.

Vad är fokus?

Fokus är möjligheten att ta emot användarinmatning via musen eller tangentbordet. Endast objektet som har fokus kan ta emot en tangentbordshändelse. Dessutom kan bara en komponent per form vara aktiv eller ha fokus i en löpande applikation vid en viss tidpunkt.

Vissa komponenter, t.ex. TImage, TPaintBox, TPanel och TLabel kan inte få fokus. Generellt sett kommer komponenter från TGraphicControl kan inte få fokus. Dessutom är komponenter som är osynliga vid körning (TTimer) kan inte få fokus.

OnKeyDown, OnKeyUp

De onKeyDown och onKeyUp händelser ger den lägsta nivån på tangentbordssvar. Både onKeyDown och onKeyUp hanterare kan svara på alla tangenter, inklusive funktionstangenter och tangenter i kombination med Flytta, Alt, och Ctrl nycklar.

Tangentbordshändelserna är inte ömsesidigt exklusiva. När användaren trycker på en knapp, båda onKeyDown och OnKeyPress händelser genereras, och när användaren släpper nyckeln, onKeyUp händelse genereras. När användaren trycker på en av knapparna som OnKeyPress upptäcker inte, bara onKeyDown händelse inträffar, följt av onKeyUp händelse.

Om du håller in en tangent, onKeyUp händelse inträffar trots allt onKeyDown och OnKeyPress händelser har inträffat.

OnKeyPress

OnKeyPress returnerar ett annat ASCII-tecken för 'g' och 'G', men onKeyDown och onKeyUp gör ingen skillnad mellan stora och små bokstäver.

Nyckel- och skiftparametrar

Sedan Nyckel parameter skickas genom referens, händelseshanteraren kan ändras Nyckel så att applikationen ser en annan nyckel som att vara involverad i händelsen. Detta är ett sätt att begränsa typen av tecken som användaren kan mata in, till exempel för att förhindra att användare skriver alfaknappar.

 om Nyckel i ['a' ... 'z'] + ['A' ... 'Z'] sedan Nyckel: = # 0 

Ovanstående uttalande kontrollerar om Nyckel parametern är i sammansättningen av två uppsättningar: små bokstäver (dvs.. en genom z) och stora tecken (A-Z). I så fall tilldelar uttalandet teckenvärdet noll till Nyckel för att förhindra någon inmatning i Redigera komponent, till exempel när den tar emot den modifierade nyckeln.

För icke-alfanumeriska tangenter kan WinAPI virtuella nyckelkoder användas för att bestämma vilken tangent som trycks in. Windows definierar specialkonstanter för varje tangent som användaren kan trycka på. Till exempel, VK_RIGHT är den virtuella nyckelkoden för högerpil.

För att få nyckeltillståndet för några speciella nycklar som FLIK eller Sida upp, vi kan använda GetKeyState Windows API-samtal. Knappstatusen anger om tangenten är upp, ner eller växlad (på eller av - växlar varje gång tangenten trycks in).

 om HiWord (GetKeyState (vk_PageUp)) 0 sedan ShowMessage ('PageUp - DOWN') annan ShowMessage ('PageUp - UP'); 

I onKeyDown och onKeyUp evenemang, Nyckel är ett osignat Word-värde som representerar en virtuell Windows-nyckel. För att få teckenvärdet från Nyckel,vi använder Chr fungera. I OnKeyPress händelse, Nyckel är en Röding värde som representerar ett ASCII-tecken.

Både onKeyDown och onKeyUp händelser använder Shift-parametern, av typen TShiftState, en uppsättning flaggor för att bestämma tillståndet för Alt-, Ctrl- och Shift-tangenterna när du trycker på en knapp.

När du till exempel trycker på Ctrl + A genereras följande nyckelhändelser:

 KeyDown (Ctrl) // ssCtrl KeyDown (Ctrl + A) // ssCtrl + 'A' KeyPress (A) KeyUp (Ctrl + A) 

Omdirigera tangentbordshändelser till formuläret

För att fånga tangenttryckningar på formnivå istället för att överföra dem till formulärets komponenter, ställ in formulärets KeyPreview egendom till True (med hjälp av Objektinspektör). Komponenten ser fortfarande händelsen, men formuläret har en möjlighet att hantera den först - att tillåta eller tillåta att några knappar trycks ned, till exempel.

Anta att du har flera redigera komponenter på ett formulär och Form.OnKeyPress proceduren ser ut som:

 procedur TForm1.FormKeyPress (avsändare: TObject; var Nyckel: Char); Börja om Nyckel i ['0' ... '9'] sedan Nyckel: = # 0 slutet; 

Om en av Edit-komponenterna har Fokus, och den KeyPreview egenskapen för ett formulär är falskt, den här koden kommer inte att köras. Med andra ord, om användaren trycker på 5 nyckel, 5 tecken kommer att visas i den fokuserade redigera komponenten.

Men om KeyPreview är satt till Sann, då är formen OnKeyPress händelse körs innan Edit-komponenten ser nyckeln som trycks in. Återigen, om användaren har tryckt på 5 -knappen, sedan tilldelar det teckenvärdet för noll till nyckeln för att förhindra numerisk inmatning i redigeringskomponenten.