Comprensione ed elaborazione degli eventi della tastiera in Delphi

Gli eventi della tastiera, insieme agli eventi del mouse, sono gli elementi principali dell'interazione di un utente con il programma.

Di seguito sono riportate informazioni su tre eventi che consentono di acquisire sequenze di tasti di un utente in un'applicazione Delphi: OnKeyDown, OnKeyUp e OnKeyPress.

Giù, Su, Premi, Giù, Su, Premi ...

Le applicazioni Delphi possono utilizzare due metodi per ricevere l'input dalla tastiera. Se un utente deve digitare qualcosa in un'applicazione, il modo più semplice per ricevere quell'input è utilizzare uno dei controlli che risponde automaticamente ai tasti premuti, come Modifica.

Altre volte e per scopi più generali, tuttavia, possiamo creare procedure in una forma che gestisca tre eventi riconosciuti dai moduli e da qualsiasi componente che accetta l'input da tastiera. Possiamo scrivere gestori di eventi per questi eventi per rispondere a qualsiasi tasto o combinazione di tasti che l'utente potrebbe premere in fase di esecuzione.

Ecco quegli eventi:

OnKeyDown - chiamato quando viene premuto un tasto qualsiasi della tastiera
OnKeyUp - chiamato quando viene rilasciato un tasto qualsiasi della tastiera
OnKeyPress - chiamato quando viene premuto un tasto corrispondente a un carattere ASCII

Gestori di tastiere

Tutti gli eventi della tastiera hanno un parametro in comune. Il Chiave Il parametro è il tasto sulla tastiera e viene utilizzato per passare in riferimento al valore del tasto premuto. Il Cambio parametro (nel OnKeyDown e OnKeyUp procedure) indica se i tasti Maiusc, Alt o Ctrl sono combinati con la sequenza di tasti.

Il parametro Sender fa riferimento al controllo utilizzato per chiamare il metodo.

 procedura TForm1.FormKeyDown (Mittente: TObject; var Parola chiave; Maiusc: TShiftState); ... procedura TForm1.FormKeyUp (Mittente: TObject; var Parola chiave; Maiusc: TShiftState); ... procedura TForm1.FormKeyPress (Mittente: TObject; var Chiave: Char); 

Rispondere quando l'utente preme i tasti di scelta rapida o acceleratore, come quelli forniti con i comandi di menu, non richiede la scrittura di gestori di eventi.

Cos'è Focus?

Focus è la capacità di ricevere input dell'utente tramite il mouse o la tastiera. Solo l'oggetto che ha lo stato attivo può ricevere un evento da tastiera. Inoltre, un solo componente per modulo può essere attivo o attivo in un'applicazione in esecuzione in un determinato momento.

Alcuni componenti, come ad esempio TImage, TPaintBox, TPanel e TLabel impossibile ricevere lo stato attivo. In generale, i componenti derivati ​​da TGraphicControl non sono in grado di ricevere focus. Inoltre, i componenti che sono invisibili in fase di esecuzione (TTimer) non può ricevere lo stato attivo.

OnKeyDown, OnKeyUp

Il OnKeyDown e OnKeyUp gli eventi forniscono il livello più basso di risposta da tastiera. Tutti e due OnKeyDown e OnKeyUp i gestori possono rispondere a tutti i tasti della tastiera, inclusi i tasti funzione e i tasti combinati con il Cambio, alt, e Ctrl chiavi.

Gli eventi della tastiera non si escludono a vicenda. Quando l'utente preme un tasto, entrambi OnKeyDown e OnKeyPress vengono generati eventi e quando l'utente rilascia la chiave, il OnKeyUp l'evento viene generato. Quando l'utente preme uno dei tasti che OnKeyPress non rileva, solo il OnKeyDown si verifica l'evento, seguito dal OnKeyUp evento.

Se si tiene premuto un tasto, il OnKeyUp l'evento si verifica dopo tutto il OnKeyDown e OnKeyPress si sono verificati eventi.

OnKeyPress

OnKeyPress restituisce un diverso carattere ASCII per 'g' e 'G', ma OnKeyDown e OnKeyUp non fare una distinzione tra maiuscole e minuscole.

Parametri chiave e Maiusc

Dal momento che il Chiave il parametro viene passato per riferimento, il gestore eventi può cambiare Chiave in modo che l'applicazione veda una chiave diversa come coinvolta nell'evento. Questo è un modo per limitare i tipi di caratteri che l'utente può inserire, ad esempio per impedire agli utenti di digitare i tasti alfabetici.

 Se Chiave nel ['a'… 'z'] + ['A' ... 'Z'] poi Chiave: = # 0 

La dichiarazione precedente controlla se il Chiave Il parametro è nell'unione di due insiemi: caratteri minuscoli (es. un' attraverso z) e caratteri maiuscoli (A-Z). In tal caso, l'istruzione assegna il valore del carattere pari a zero a Chiave per impedire qualsiasi input nel modificare componente, ad esempio, quando riceve la chiave modificata.

Per i tasti non alfanumerici, è possibile utilizzare i codici dei tasti virtuali WinAPI per determinare il tasto premuto. Windows definisce costanti speciali per ciascun tasto che l'utente può premere. Per esempio, VK_RIGHT è il codice chiave virtuale per il tasto freccia destra.

Per ottenere lo stato chiave di alcuni tasti speciali come TAB o Pagina su, possiamo usare il GetKeyState Chiamata API Windows. Lo stato del tasto specifica se il tasto è su, giù o attivato (acceso o spento - alternando ogni volta che si preme il tasto).

 Se HiWord (GetKeyState (vk_PageUp)) 0 poi ShowMessage ('PageUp - DOWN') altro ShowMessage ('PageUp - UP'); 

Nel OnKeyDown e OnKeyUp eventi, Chiave è un valore di Word senza segno che rappresenta una chiave virtuale di Windows. Per ottenere il valore del carattere da Chiave,noi usiamo il Chr funzione. Nel OnKeyPress evento, Chiave è un carbonizzare valore che rappresenta un carattere ASCII.

Tutti e due OnKeyDown e OnKeyUp gli eventi usano il parametro Shift, di tipo TShiftState, un set di flag per determinare lo stato dei tasti Alt, Ctrl e Maiusc quando viene premuto un tasto.

Ad esempio, quando si preme Ctrl + A, vengono generati i seguenti eventi chiave:

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

Reindirizzamento degli eventi della tastiera al modulo

Per intercettare le sequenze di tasti a livello di modulo anziché passarle ai componenti del modulo, impostare i moduli KeyPreview proprietà su True (usando il Ispettore oggetti). Il componente vede ancora l'evento, ma il modulo ha l'opportunità di gestirlo per primo - per consentire o impedire la pressione di alcuni tasti, ad esempio.

Supponiamo di avere diversi componenti Modifica in un modulo e il Form.OnKeyPress la procedura è simile a:

 procedura TForm1.FormKeyPress (Mittente: TObject; var Chiave: Char); inizio Se Chiave nel ['0'… '9'] poi Chiave: = # 0 fine; 

Se uno dei componenti Modifica ha il Messa a fuoco, e il KeyPreview la proprietà di un modulo è False, questo codice non verrà eseguito. In altre parole, se l'utente preme il tasto 5 chiave, il 5 il personaggio apparirà nel componente Modifica focalizzato.

Tuttavia, se il KeyPreview è impostato su True, quindi il modulo OnKeyPress L'evento viene eseguito prima che il componente Modifica visualizzi il tasto premuto. Ancora una volta, se l'utente ha premuto il tasto 5 chiave, quindi assegna il valore del carattere zero a Chiave per impedire l'immissione numerica nel componente Modifica.