Toetsenbordgebeurtenissen in Delphi begrijpen en verwerken

Toetsenbordgebeurtenissen, samen met muisgebeurtenissen, zijn de primaire elementen van de interactie van een gebruiker met uw programma.

Hieronder vindt u informatie over drie gebeurtenissen waarmee u de toetsaanslagen van een gebruiker in een Delphi-toepassing kunt vastleggen: onKeyDown, onkeyup en OnKeyPress.

Omlaag, Omhoog, Druk, Omlaag, Omhoog, Druk ...

Delphi-toepassingen kunnen twee methoden gebruiken om de invoer van het toetsenbord te ontvangen. Als een gebruiker iets in een toepassing moet typen, is de eenvoudigste manier om die invoer te ontvangen, een van de besturingselementen te gebruiken die automatisch reageert op toetsaanslagen, zoals Bewerken.

Op andere momenten en voor meer algemene doeleinden kunnen we echter procedures maken in een vorm die drie gebeurtenissen afhandelt die worden herkend door formulieren en door elk onderdeel dat toetsenbordinvoer accepteert. We kunnen gebeurtenisafhandelaars schrijven voor deze gebeurtenissen om te reageren op elke toets of toetsencombinatie waarop de gebruiker tijdens runtime zou kunnen drukken.

Dit zijn die evenementen:

onKeyDown - wordt opgeroepen wanneer een toets op het toetsenbord wordt ingedrukt
onkeyup - wordt aangeroepen wanneer een toets op het toetsenbord wordt losgelaten
OnKeyPress - wordt opgeroepen wanneer een toets die overeenkomt met een ASCII-teken wordt ingedrukt

Toetsenbordhandlers

Alle toetsenbordgebeurtenissen hebben één parameter gemeenschappelijk. De Sleutel parameter is de toets op het toetsenbord en wordt gebruikt om de referentie van de waarde van de ingedrukte toets door te geven. De Verschuiving parameter (in de onKeyDown en onkeyup procedures) geeft aan of de Shift-, Alt- of Ctrl-toetsen worden gecombineerd met de toetsaanslag.

De parameter Sender verwijst naar het besturingselement dat is gebruikt om de methode aan te roepen.

 procedure TForm1.FormKeyDown (Sender: TObject; var Sleutel: Woord; Shift: TShiftState);… procedure TForm1.FormKeyUp (Sender: TObject; var Sleutel: Woord; Shift: TShiftState);… procedure TForm1.FormKeyPress (Sender: TObject; var Sleutel: Char); 

Reageren wanneer de gebruiker op sneltoetsen of sneltoetsen drukt, zoals die voorzien van menuopdrachten, vereist geen gebeurtenishandlers schrijven.

Wat is focus??

Focus is de mogelijkheid om gebruikersinvoer te ontvangen via de muis of het toetsenbord. Alleen het object dat de focus heeft, kan een toetsenbordgebeurtenis ontvangen. Ook kan slechts één component per formulier op een bepaald moment actief zijn of de focus hebben in een actieve toepassing.

Sommige componenten, zoals TImage, TPaintBox, TPanel en TLabel kan geen focus krijgen. Over het algemeen zijn componenten afgeleid van TGraphicControl kunnen geen focus ontvangen. Bovendien zijn componenten die tijdens runtime onzichtbaar zijn (TTimer) kan geen focus krijgen.

OnKeyDown, OnKeyUp

De onKeyDown en onkeyup evenementen bieden het laagste niveau van toetsenbordrespons. Beide onKeyDown en onkeyup handlers kunnen reageren op alle toetsenbordtoetsen, inclusief functietoetsen en toetsen in combinatie met de Verschuiving, alt, en Ctrl sleutels.

De toetsenbordgebeurtenissen sluiten elkaar niet uit. Wanneer de gebruiker op een toets drukt, zowel de onKeyDown en OnKeyPress gebeurtenissen worden gegenereerd, en wanneer de gebruiker de sleutel loslaat, de onkeyup evenement is gegenereerd. Wanneer de gebruiker op een van de toetsen drukt die OnKeyPress detecteert niet, alleen de onKeyDown gebeurtenis vindt plaats, gevolgd door de onkeyup evenement.

Als u een toets ingedrukt houdt, wordt de onkeyup gebeurtenis vindt plaats nadat de onKeyDown en OnKeyPress gebeurtenissen hebben plaatsgevonden.

OnKeyPress

OnKeyPress retourneert een ander ASCII-teken voor 'g' en 'G', maar onKeyDown en onkeyup maak geen onderscheid tussen hoofdletters en kleine letters.

Key- en Shift-parameters

Sinds de Sleutel parameter wordt doorgegeven door verwijzing, kan de gebeurtenishandler worden gewijzigd Sleutel zodat de toepassing een andere sleutel ziet als betrokken bij het evenement. Dit is een manier om het soort tekens dat de gebruiker kan invoeren te beperken, zoals om te voorkomen dat gebruikers alfatoetsen typen.

 als Sleutel in ['a' ... 'z'] + ['A' ... 'Z'] vervolgens Sleutel: = # 0 

Bovenstaande verklaring controleert of de Sleutel parameter is in de unie van twee sets: kleine letters (d.w.z.. een door z) en hoofdletters (AZ). Als dit het geval is, wijst de instructie de tekenwaarde van nul toe aan Sleutel om invoer in de te voorkomen Bewerk component, bijvoorbeeld wanneer het de gewijzigde sleutel ontvangt.

Voor niet-alfanumerieke toetsen kunnen WinAPI virtuele sleutelcodes worden gebruikt om de ingedrukte toets te bepalen. Windows definieert speciale constanten voor elke toets waarop de gebruiker kan drukken. Bijvoorbeeld, VK_RIGHT is de virtuele sleutelcode voor de pijl naar rechts.

Om de sleutelstatus van sommige speciale sleutels zoals te krijgen TAB of Pagina omhoog, we kunnen de gebruiken GetKeyState Windows API-aanroep. De toetsstatus geeft aan of de toets omhoog, omlaag of geschakeld is (aan of uit - wisselend telkens wanneer de toets wordt ingedrukt).

 als HiWord (GetKeyState (vk_PageUp)) 0 vervolgens ShowMessage ('PageUp - DOWN') anders ShowMessage ('PageUp - UP'); 

In de onKeyDown en onkeyup events, Sleutel is een niet-ondertekende Word-waarde die een virtuele Windows-sleutel vertegenwoordigt. Om de karakterwaarde van te krijgen Sleutel,wij gebruiken de Chr functie. In de OnKeyPress evenement, Sleutel is een verkolen waarde die een ASCII-teken vertegenwoordigt.

Beide onKeyDown en onkeyup evenementen gebruiken de Shift-parameter, van het type TShiftState, een set vlaggen om de status van de Alt-, Ctrl- en Shift-toetsen te bepalen wanneer een toets wordt ingedrukt.

Wanneer u bijvoorbeeld op Ctrl + A drukt, worden de volgende toetsgebeurtenissen gegenereerd:

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

Toetsenbordgebeurtenissen omleiden naar het formulier

Als u toetsaanslagen op formulierniveau wilt vastleggen in plaats van ze door te geven aan de componenten van het formulier, stelt u de formulieren in KeyPreview eigenschap naar True (met behulp van de Object inspecteur). De component ziet nog steeds de gebeurtenis, maar het formulier heeft de mogelijkheid om het eerst af te handelen - om toe te staan ​​of een aantal toetsen niet in te drukken, bijvoorbeeld.

Stel dat u meerdere componenten op een formulier en de Form.OnKeyPress procedure ziet eruit als:

 procedure TForm1.FormKeyPress (afzender: TObject; var Sleutel: Char); beginnen als Sleutel in ['0' ... '9'] vervolgens Sleutel: = # 0 einde; 

Als een van de componenten Bewerken de Focus, en de KeyPreview eigenschap van een formulier is False, deze code wordt niet uitgevoerd. Met andere woorden, als de gebruiker op drukt 5 sleutel, de 5 teken zal verschijnen in de gerichte component Bewerken.

Als de KeyPreview is ingesteld op Waar en vervolgens op het formulier OnKeyPress gebeurtenis wordt uitgevoerd voordat de component Bewerken de toets ziet die wordt ingedrukt. Nogmaals, als de gebruiker op heeft gedrukt 5 toets, dan wijst het de tekenwaarde van nul toe aan Sleutel om numerieke invoer in de component Bewerken te voorkomen.