Delphi notează cum să închideți corect formularul prin evadare

De foarte multe ori este necesar să închideți fereastra apăsând tasta Escape. Este foarte convenabil. Mai mult decât atât, există o corectitudine nerambursabilă: interfețele de date de intrare ar trebui să poată funcționa fără un șoarece. Ie astfel încât, după introducerea datelor de pe tastatură, puteți apăsa Enter sau Escape, mai degrabă decât să ajungeți la mouse și apoi să direcționați cursorul la cruce mică.







Poate că veți afla că subiectul este bătut și că această problemă se poate referi doar la începători. Cu toate acestea, chiar și programatorii cu experiență nu știu întotdeauna cum să o facă în mod corect. În acest articol voi discuta, de asemenea, cum să se ocupe corect de alte chei de dialog.

Ei bine, atunci. Iată câteva opțiuni.

Dacă aveți butoane pe formular (TButton), puteți seta proprietatea unuia dintre butoanele: Cancel: = True. Când utilizatorul face clic pe tasta Escape, va funcționa modulul Handler OnClick al acestui buton, în care puteți apela pur și simplu metoda de închidere a formularului.

Pentru forma modală, este chiar mai simplu: în locul manipulatorului OnClick, specificați pur și simplu proprietatea ModalResult: = mrCancel. După ce încercați să apelați butonul OnClick, VCL se uită la această proprietate și dacă este diferită de zero (<> mrNone), apoi o înregistrează în forma ModalResult, ceea ce duce la închiderea formei modale.

Această opțiune este corectă. dar necesită prezența unor butoane suplimentare pe formular, ceea ce nu este întotdeauna convenabil.

La această opțiune, voi prezenta toate metodele de interceptare a apăsării oricărei taste pe formular. Pentru a face acest lucru, trebuie să setați KeyPreview: = Proprietate adevărată în formular și să setați funcția Handler OnKeyPress:

sau OnKeyDown. Fie OnKeyUp.

După cum puteți vedea, această opțiune este destul de simplă, și cea mai comună (care poate fi găsită pe Internet). Dar această opțiune nu este complet corectă. Pentru a arăta acest lucru, vom face mai multe acțiuni cu formularul.







Creați o casetă obișnuită (TCombobox) pe formular, umpleți elementele sale cu valori arbitrare. Rulați aplicația, deschideți formularul (cu caseta combo și dispozitivul de comandă OnKeyPress). Acum, deschideți lista verticală și faceți clic pe Escape. Ce sa întâmplat? Așa că forma a fost închisă. Deși sunt mai mult decât sigur că utilizatorul în acest moment se aștepta la un comportament diferit la apăsarea Escape. Anume: la prima apăsare - închiderea casetei combo și deja la a doua presare - închiderea formularului. (Rețineți că, pe lângă comboboxul din formular, pot exista și alte componente care manipulează cheia Escape în felul lor.)

Acest lucru se datorează faptului că operatorul de formular OnKeyPress a lucrat înainte ca comboboxul să primească un eveniment despre clic pe Escape (amintesc că KeyPreview este setat la True?). Dacă KeyPreview este resetat la False, formularul OnKeyPress nu va fi procesat deloc.

Deci, cum fac corect cheia Escape?

În acest articol, am menționat fraza "chei de dialog" de mai multe ori. Aceste taste includ: Escape, Enter, Tab și săgeți (și câteva alte taste ale tastaturilor non-standard). Ele sunt numite astfel, deoarece aceste chei sunt speciale. Ele nu sunt destinate introducerii directe a datelor, ci sunt utilizate pentru a controla ferestrele (caseta combo este, de asemenea, o fereastră).

Pentru a procesa tastele de dialog din VCL, utilizați mesajul CM_DIALOGKEY. Acest mesaj primește mai întâi controlul curent (adică cel aflat în prezent în focalizare) și apoi (până când este procesat, adică rezultatul = 0) de către controlul părinte (de la curent la nivel de formular). Dacă CM_DIALOGKEY nu a fost procesată, atunci este declanșată OnKeyDown a controlului curent.

În al doilea exemplu, pentru a prinde Escape la nivelul formularului, am creat KeyPreview. Această proprietate întrerupe logica descrisă: toate mesajele de la tastatură sunt prelucrate mai întâi de către formular și apoi ajung la control.

Cui îi pasă, poate învăța codul sursă VCL, voi da a treia opțiune.

Al treilea exemplu de realizare. Universal.

CM_DIALOGKEY ar trebui, de asemenea, să fie gestionate pentru celelalte taste de dialog. Aici este un exemplu tipic: pe formular au o intrare (SomeEdit: tEditează) și masă. Prin apăsarea Enter în SomeEdit, utilizatorul se așteaptă ca unele reacție (de exemplu date de filtrare în tabel). Cu toate acestea, în cazul în care forma este modală, și pe ea există un buton „OK“ (care a expus proprietate implicită: = Adevărat și ModalResult: = mrOk), mesajul este apăsat, nu va avea timp pentru a ajunge la Enter pentru a SomeEdit (lucrări Faceți clic pe butonul și forma modală este închisă). În acest caz, puteți scrie un astfel de handler:

Ei bine, vobschem ceva și tot ...







Articole similare

Trimiteți-le prietenilor: