Toetsenbordgebeurtenissen in Delphi begrijpen en verwerken

Toetsenbordevenementen, samen met muisgebeurtenissen, zijn de belangrijkste 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.

Onder, Boven, Druk op, Onder, Boven, Druk op...

Delphi-toepassingen kunnen twee methoden gebruiken om de invoer van het toetsenbord te ontvangen. Als een gebruiker iets in een applicatie moet typen, is de eenvoudigste manier om die invoer te ontvangen, een van de bedieningselementen 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 gebeurtenishandlers voor deze gebeurtenissen schrijven om te reageren op elke toets of toetsencombinatie die de gebruiker tijdens runtime kan indrukken.

instagram viewer

Dit zijn die evenementen:

OnKeyDown - wordt gebeld wanneer een toets op het toetsenbord wordt ingedrukt
OnKeyUp - wordt gebeld wanneer een toets op het toetsenbord wordt losgelaten
OnKeyPress - wordt aangeroepen wanneer een toets wordt ingedrukt die overeenkomt met een ASCII-teken

Toetsenbordhandlers

Alle toetsenbordevenementen hebben er een parameter met elkaar gemeen. De Sleutel parameter is de toets op het toetsenbord en wordt gebruikt om te verwijzen naar de waarde van de ingedrukte toets. De Verschuiving parameter (in de OnKeyDown en OnKeyUp procedures) geeft aan of de toetsen Shift, Alt of Ctrl worden gecombineerd met de toetsaanslag.

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

procedure TForm1.FormKeyDown (Afzender: TObject; var Sleutel: Word; Shift: TShiftState);... procedure TForm1.FormKeyUp (Afzender: TObject; var Sleutel: Word; Shift: TShiftState);... procedure TForm1.FormKeyPress (Afzender: TObject; var Sleutel: Char); 

Reageren wanneer de gebruiker op sneltoetsen of sneltoetsen drukt, zoals de toetsen die bij menuopdrachten worden geleverd, vereist geen eventhandlers.

Wat is focus?

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

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 events bieden het laagste niveau van toetsenbordreactie. Beide OnKeyDown en OnKeyUp handlers kunnen reageren op alle klaviertoetsen, inclusief functietoetsen en toetsen in combinatie met de Verschuiving, Alt, en Ctrl sleutels.

De toetsenbordevenementen sluiten elkaar niet uit. Wanneer de gebruiker op een toets drukt, worden zowel de OnKeyDown en OnKeyPress gebeurtenissen worden gegenereerd en wanneer de gebruiker de sleutel loslaat, de OnKeyUp gebeurtenis wordt gegenereerd. Wanneer de gebruiker op een van de toetsen drukt die OnKeyPress detecteert niet, alleen de OnKeyDown gebeurtenis plaatsvindt, gevolgd door de OnKeyUp evenement.

Als u een toets ingedrukt houdt, wordt de OnKeyUp gebeurtenis vindt plaats na alle 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.

Sleutel- en schakelparameters

Sinds de Sleutel parameter is doorgegeven als referentie, de gebeurtenishandler kan wijzigen Sleutel zodat de applicatie een andere sleutel ziet als betrokken bij het evenement. Dit is een manier om het soort tekens dat de gebruiker kan invoeren te beperken, bijvoorbeeld om te voorkomen dat gebruikers alfatoetsen typen.

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

De bovenstaande verklaring controleert of de Sleutel parameter is in de vereniging van twee sets: kleine letters (d.w.z. een door z) en hoofdletters (A-Z). Als dat zo is, wijst de instructie de tekenwaarde nul toe aan Sleutel om invoer in de Bewerk component, bijvoorbeeld wanneer deze de gewijzigde sleutel ontvangt.

WinAPI voor niet-alfanumerieke sleutels virtuele sleutelcodes kan worden gebruikt om de ingedrukte toets te bepalen. Windows definieert speciale constanten voor elke toets die de gebruiker kan indrukken. Bijvoorbeeld, VK_RIGHT is de virtuele sleutelcode voor de pijl naar rechts.

Om de sleutelstatus te krijgen van een aantal speciale sleutels zoals TABBLAD of Pagina omhoogkunnen we de GetKeyState Windows API-aanroep. De toetsstatus geeft aan of de toets omhoog, omlaag of omgeschakeld is (aan of uit - afwisselend elke keer dat de toets wordt ingedrukt).

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

In de OnKeyDown en OnKeyUp evenementen, Sleutel is een niet-ondertekende Word-waarde die een virtuele Windows-sleutel vertegenwoordigt. Om de tekenwaarde van te krijgen Sleutel,wij gebruiken de Chr functie. In de OnKeyPress evenement, Sleutel is een Char waarde die een ASCII-teken vertegenwoordigt.

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

Als u bijvoorbeeld op Ctrl + A drukt, worden de volgende belangrijke gebeurtenissen gegenereerd:

 KeyDown (Ctrl) // ssCtrl
KeyDown (Ctrl + A) // ssCtrl + 'A'Toets indrukken (A) KeyUp (Ctrl + A)

Toetsenbordgebeurtenissen omleiden naar het formulier

Stel de formulieren in om toetsaanslagen vast te houden op formulierniveau in plaats van ze door te geven aan de componenten van het formulier Sleutelvoorbeeld eigendom van True (met behulp van de Object Inspector). Het onderdeel ziet de gebeurtenis nog steeds, maar het formulier heeft de mogelijkheid om het eerst af te handelen - om bijvoorbeeld toe te staan ​​dat bepaalde toetsen worden ingedrukt.

Stel dat u verschillende componenten voor bewerken op een formulier en de Het formulier. OnKeyPress procedure ziet eruit als:

procedureTForm1.FormKeyPress (Afzender: TObject; var Sleutel: Char); beginnenals Sleutel in ['0'..'9'] vervolgens Sleutel: = # 0. einde; 

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

Als de Sleutelvoorbeeld is ingesteld op Waar, dan is het formulier OnKeyPress gebeurtenis wordt uitgevoerd voordat het onderdeel Bewerken de ingedrukte toets ziet. Nogmaals, als de gebruiker op 5 key, dan wijst het de karakterwaarde nul toe aan Key om numerieke invoer in de Edit component te voorkomen.

instagram story viewer