Klaviatūros įvykių supratimas ir apdorojimas Delfuose

Klaviatūros įvykiai kartu su pelių įvykiai, yra pagrindiniai vartotojo sąveikos su jūsų programa elementai.

Žemiau yra informacija apie tris įvykius, leidžiančius užfiksuoti vartotojo klavišus „Delphi“ programoje: „OnKeyDown“, „OnKeyUp“ ir „OnKeyPress“.

Žemyn, aukštyn, paspauskite, žemyn, aukštyn, paspauskite...

„Delphi“ programos gali naudoti du būdus, kaip gauti įvestį iš klaviatūros. Jei vartotojas turi ką nors įvesti programoje, lengviausias būdas gauti tą įvestį yra naudoti vieną iš valdiklių, kurie automatiškai reaguoja į klavišų paspaudimus, pvz., Redaguoti.

Tačiau kitu metu ir bendresniems tikslams mes galime sukurti tokias procedūras, kurios apdorotų tris įvykius, atpažintus pagal formas ir bet kurį komponentą, kuris priima klaviatūros įvestį. Mes galime parašyti šių įvykių tvarkytuvus, kad jie atsakytų į bet kurį klavišą ar klavišų derinį, kurį vartotojas gali paspausti vykdydamas.

Štai šie įvykiai:

„OnKeyDown“ - iškviečiamas paspaudus bet kurį klaviatūros mygtuką
„OnKeyUp“ - iškviečiamas, kai atleidžiamas bet kuris klaviatūros klavišas

instagram viewer

„OnKeyPress“ - iškviečiamas, kai paspaudžiamas klavišas, atitinkantis ASCII ženklą

Klaviatūros tvarkytojai

Visi klaviatūros įvykiai turi vieną parametras bendrai. Raktas parametras yra klaviatūros klavišas ir naudojamas perduoti nurodant paspausto mygtuko vertę. Pamaina parametras ( „OnKeyDown“ ir „OnKeyUp“ procedūros) nurodo, ar klavišai „Shift“, „Alt“ ar „Ctrl“ yra derinami su klavišo paspaudimu.

Siuntėjo parametras nurodo valdiklį, kuris buvo naudojamas metodui vadinti.

procedūra TForm1.FormKeyDown (Siuntėjas: TObject; var Raktas: žodis; „Shift“: „TShiftState“);... procedūra TForm1.FormKeyUp (Siuntėjas: TObject; var Raktas: žodis; „Shift“: „TShiftState“);... procedūra TForm1.FormKeyPress (Siuntėjas: TObject; var Raktas: Char); 

Atsakant, kai vartotojas paspaudžia sparčiuosius klavišus arba spartintuvus, tokius kaip tie, kurie pateikiami su meniu komandomis, nereikia rašyti įvykių tvarkytuvų.

Kas yra „Focus“?

Dėmesys yra galimybė priimti vartotojo duomenis per pelė arba klaviatūra. Klaviatūros įvykį gali priimti tik fokusuotas objektas. Be to, tik vienas komponentas kiekvienoje formoje bet kuriuo metu gali būti aktyvus arba sutelkti dėmesį veikiančioje programoje.

Kai kurie komponentai, tokie kaip TImage, „TPaintBox“, TPanelis ir TLabel negali susikaupti. Apskritai, komponentai, gauti iš „TGraphicControl“ nesugeba sutelkti dėmesio. Be to, komponentai, kurie nematomi vykdymo metu (TTimer) negali susikaupti.

„OnKeyDown“, „OnKeyUp“

„OnKeyDown“ ir „OnKeyUp“ įvykiai pateikia žemiausią klaviatūros atsako lygį. Abu „OnKeyDown“ ir „OnKeyUp“ tvarkytojai gali atsakyti į visus klaviatūros klavišus, įskaitant funkcijų klavišus ir klavišus, sujungtus su Pamaina, Altir „Ctrl“ raktai.

Klaviatūros įvykiai nėra vienas kito nesuderinami. Kai vartotojas paspaudžia mygtuką, abu „OnKeyDown“ ir „OnKeyPress“ įvykiai sugeneruojami, o vartotojui paleidus raktą, „OnKeyUp“ įvykis generuojamas. Kai vartotojas paspaudžia vieną iš klavišų „OnKeyPress“ neaptinka, tik „OnKeyDown“ įvykis, po kurio eina „OnKeyUp“ įvykis.

Jei laikysite nuspaudę klavišą, „OnKeyUp“ įvykis įvyksta po visų „OnKeyDown“ ir „OnKeyPress“ įvykiai įvyko.

„OnKeyPress“

„OnKeyPress“ grąžina skirtingą „g“ ir „G“ ASCII simbolį, bet „OnKeyDown“ ir „OnKeyUp“ neskirkite didžiųjų ir mažųjų raidžių.

Pagrindiniai ir poslinkio parametrai

Nuo Raktas parametras perduodamas kaip nuoroda, įvykių tvarkytojas gali pasikeisti Raktas kad programa matytų kitą raktą, kaip dalyvaujantį renginyje. Tai būdas apriboti simbolių, kuriuos vartotojas gali įvesti, rūšis, pavyzdžiui, neleisti vartotojams įvesti raides.

jei Raktas į ['a'.. 'z'] + ['A'.. 'Z'] tada Raktas: = # 0 

Pirmiau pateiktu teiginiu patikrinama, ar Raktas parametras yra dviejų rinkinių sąjungoje: mažosios raidės (t. a per z) ir didžiosios raidės (A – Z). Jei taip, teiginyje simbolio reikšmė nuliui priskiriama Raktas užkirsti kelią bet kokiam įėjimui į Redaguoti komponentas, pavyzdžiui, kai jis gauna modifikuotą raktą.

Ne raidinių ir skaitmeninių klavišų „WinAPI“ virtualiųjų raktų kodai gali būti naudojamas paspaudus mygtuką. „Windows“ nustato specialias kiekvieno klavišo, kurį vartotojas gali paspausti, konstantas. Pavyzdžiui, VK_RIGHT yra dešiniojo rodyklės klavišo virtualiojo rakto kodas.

Norėdami gauti kai kurių specialių klavišų rakto būseną, pvz TAB arba Į viršų, galime naudoti „GetKeyState“ „Windows API“ skambutis. Klavišo būsena nurodo, ar klavišas yra aukštyn, žemyn, ar perjungiamas (įjungtas arba išjungtas - keičiasi kiekvieną kartą paspaudžiant klavišą).

jei „HiWord“ („GetKeyState“ („vk_PageUp“)) <> 0 tada
„ShowMessage“ („PageUp - DOWN“)
Kitas
„ShowMessage“ ('PageUp - UP'); 

Viduje „OnKeyDown“ ir „OnKeyUp“ įvykiai, Raktas yra nepasirašyta „Word“ reikšmė, vaizduojanti „Windows“ virtualų raktą. Norint gauti simbolio reikšmę iš Raktas, mes naudojame Chr funkcija. Viduje „OnKeyPress“ įvykis, Raktas yra Char vertė, kuri žymi ASCII simbolį.

Abu „OnKeyDown“ ir „OnKeyUp“ įvykiai naudoja tipo „Shift“ „TShiftState“, nustatykite vėliavas, kad nustatytumėte klavišų „Alt“, „Ctrl“ ir „Shift“ būseną, kai paspaudžiamas klavišas.

Pvz., Kai paspaudžiate Ctrl + A, sugeneruojami šie pagrindiniai įvykiai:

 „KeyDown“ („Ctrl“) // ssCtrl
„KeyDown“ („Ctrl“ + A) // „ssCtrl“ + „A“„KeyPress“ (A) „KeyUp“ („Ctrl“ + A)

Klaviatūros įvykių nukreipimas į formą

Norėdami įstrigti paspaudimais formos lygyje, užuot juos perdavę formos komponentams, nustatykite formos „KeyPreview“ nuosavybė True (naudojant Objektų inspektorius). Komponentas vis tiek mato įvykį, tačiau forma turi galimybę pirmiausia jį sutvarkyti - leisti arba neleisti, pavyzdžiui, paspausti kai kuriuos klavišus.

Tarkime, kad formoje ir formoje yra keli redagavimo komponentai Forma. „OnKeyPress“ procedūra atrodo taip:

procedūraTForm1.FormKeyPress (Siuntėjas: TObject; var Raktas: Char); prasidedajei Raktas į ['0'..'9'] tada Raktas: = # 0. galas; 

Jei vienas iš Redaguoti komponentų turi Dėmesys, ir „KeyPreview“ formos nuosavybė yra klaidinga, šis kodas nebus vykdomas. Kitaip tariant, jei vartotojas paspaudžia 5 raktas, 5 simbolis pasirodys fokusuotame redagavimo komponente.

Tačiau jei „KeyPreview“ yra nustatyta į True, tada formos „OnKeyPress“ įvykis vykdomas anksčiau, nei komponentas „Redaguoti“ mato paspaustą klavišą. Vėlgi, jei vartotojas paspaudė 5 klavišą, tada jis priskiria klavišo simbolio reikšmę nuliui, kad būtų išvengta skaitinio įvedimo į „Redaguoti“ komponentą.