Comprendre et traiter les événements de clavier dans Delphi

Les événements de clavier, ainsi que les événements de souris, sont les principaux éléments de l'interaction d'un utilisateur avec votre programme.

Vous trouverez ci-dessous des informations sur trois événements qui vous permettent de capturer les frappes d'un utilisateur dans une application Delphi: OnKeyDown, OnKeyUp et OnKeyPress.

Bas, haut, appuyez sur, bas, haut, appuyez sur…

Les applications Delphi peuvent utiliser deux méthodes pour recevoir l'entrée du clavier. Si un utilisateur doit taper quelque chose dans une application, le moyen le plus simple de recevoir cette entrée consiste à utiliser l'un des contrôles qui répond automatiquement aux pressions sur les touches, comme Modifier.

À d'autres moments et à des fins plus générales, cependant, nous pouvons créer des procédures dans un formulaire qui gèrent trois événements reconnus par les formulaires et par tout composant qui accepte la saisie au clavier. Nous pouvons écrire des gestionnaires d'événements pour que ces événements répondent à n'importe quelle touche ou combinaison de touches sur laquelle l'utilisateur peut appuyer lors de l'exécution.

Voici ces événements:

OnKeyDown - appelé lorsqu'une touche du clavier est enfoncée
OnKeyUp - appelé lorsqu'une touche du clavier est relâchée
OnKeyPress - appelé lorsqu'une touche correspondant à un caractère ASCII est enfoncée

Gestionnaires de clavier

Tous les événements clavier ont un paramètre en commun. le Clé paramètre est la touche du clavier et est utilisé pour passer par référence à la valeur de la touche enfoncée. le Décalage paramètre (dans le OnKeyDown et OnKeyUp procédures) indique si les touches Maj, Alt ou Ctrl sont combinées avec la séquence de touches.

Le paramètre Sender fait référence au contrôle qui a été utilisé pour appeler la méthode.

 procédure TForm1.FormKeyDown (expéditeur: TObject; var Mot-clé; Maj: TShiftState);… procédure TForm1.FormKeyUp (expéditeur: TObject; var Mot-clé; Maj: TShiftState);… procédure TForm1.FormKeyPress (expéditeur: TObject; var Key: Char); 

Répondre lorsque l'utilisateur appuie sur les touches de raccourci ou d'accélérateur, telles que celles fournies avec les commandes de menu, ne nécessite pas d'écriture de gestionnaires d'événements.

Qu'est-ce que le focus?

L'accent est mis sur la capacité de recevoir les commentaires des utilisateurs via la souris ou le clavier. Seul l'objet qui a le focus peut recevoir un événement clavier. En outre, un seul composant par formulaire peut être actif ou avoir le focus dans une application en cours d'exécution à un moment donné.

Certains composants, tels que TImage, TPaintBox, TPanel et TLabel ne peut pas recevoir le focus. En général, les composants dérivés de TGraphicControl sont incapables de se concentrer. De plus, les composants invisibles au moment de l'exécution (TTimer) ne peut pas recevoir le focus.

OnKeyDown, OnKeyUp

le OnKeyDown et OnKeyUp les événements fournissent le plus bas niveau de réponse du clavier. Tous les deux OnKeyDown et OnKeyUp les gestionnaires peuvent répondre à toutes les touches du clavier, y compris les touches de fonction et les touches combinées avec le Décalage, Alt, et Ctrl clés.

Les événements clavier ne s'excluent pas mutuellement. Lorsque l'utilisateur appuie sur une touche, OnKeyDown et OnKeyPress des événements sont générés et lorsque l'utilisateur relâche la clé, le OnKeyUp l'événement est généré. Lorsque l'utilisateur appuie sur l'une des touches qui OnKeyPress ne détecte pas, seul le OnKeyDown se produit, suivi de OnKeyUp un événement.

Si vous maintenez une touche enfoncée, OnKeyUp l'événement se produit après tous les OnKeyDown et OnKeyPress des événements se sont produits.

OnKeyPress

OnKeyPress renvoie un caractère ASCII différent pour «g» et «G», mais OnKeyDown et OnKeyUp ne fait pas de distinction entre les touches alpha majuscules et minuscules.

Paramètres clés et de décalage

Depuis le Clé est passé par référence, le gestionnaire d'événements peut changer Clé de sorte que l'application voit une clé différente comme étant impliquée dans l'événement. C'est un moyen de limiter les types de caractères que l'utilisateur peut saisir, comme pour empêcher les utilisateurs de taper des touches alpha.

 si Clé dans ['a'… 'z'] + ['A'… 'Z'] ensuite Clé: = # 0 

La déclaration ci-dessus vérifie si le Clé Le paramètre est dans l'union de deux ensembles: les caractères minuscules (c'est-à-dire. une par z) et les majuscules (A-Z). Si tel est le cas, l'instruction affecte la valeur de caractère zéro à Clé pour empêcher toute entrée dans le Éditer composant, par exemple, lorsqu'il reçoit la clé modifiée.

Pour les clés non alphanumériques, les codes de clé virtuelle WinAPI peuvent être utilisés pour déterminer la touche enfoncée. Windows définit des constantes spéciales pour chaque touche sur laquelle l'utilisateur peut appuyer. Par exemple, VK_RIGHT est le code de clé virtuelle pour la touche Flèche droite.

Pour obtenir l'état clé de certaines touches spéciales comme LANGUETTE ou PageUp, nous pouvons utiliser le GetKeyState Appel de l'API Windows. L'état de la touche spécifie si la touche est vers le haut, le bas ou la bascule (on ou off - en alternance à chaque pression sur la touche).

 si HiWord (GetKeyState (vk_PageUp)) 0 ensuite ShowMessage ('PageUp - DOWN') autre ShowMessage ('PageUp - UP'); 

dans le OnKeyDown et OnKeyUp événements, Clé est une valeur Word non signée qui représente une clé virtuelle Windows. Pour obtenir la valeur de caractère de Clé,nous utilisons le Chr une fonction. dans le OnKeyPress un événement, Clé est un Carboniser valeur qui représente un caractère ASCII.

Tous les deux OnKeyDown et OnKeyUp les événements utilisent le paramètre Shift, de type TShiftState, un ensemble de drapeaux pour déterminer l'état des touches Alt, Ctrl et Maj lorsqu'une touche est enfoncée.

Par exemple, lorsque vous appuyez sur Ctrl + A, les événements clés suivants sont générés:

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

Rediriger les événements du clavier vers le formulaire

Pour intercepter les frappes au niveau du formulaire au lieu de les transmettre aux composants du formulaire, définissez KeyPreview à True (en utilisant la propriété Inspecteur d'objets). Le composant voit toujours l'événement, mais le formulaire a la possibilité de le gérer en premier - pour autoriser ou interdire certaines touches à appuyer, par exemple.

Supposons que vous ayez plusieurs composants Modifier sur un formulaire et Form.OnKeyPress la procédure ressemble à:

 procédure TForm1.FormKeyPress (Sender: TObject; var Key: Char); commencer si Clé dans ['0'… '9'] ensuite Clé: = # 0 fin; 

Si l'un des composants Edit a le Concentrer, et le KeyPreview La propriété d'un formulaire est False, ce code ne s'exécutera pas. En d'autres termes, si l'utilisateur appuie sur la touche 5 clé, la 5 apparaîtra dans le composant d'édition focalisé.

Cependant, si le KeyPreview est défini sur True, alors le formulaire est OnKeyPress est exécuté avant que le composant Edit ne voie la touche enfoncée. Encore une fois, si l'utilisateur a appuyé sur la touche 5 clé, puis il attribue la valeur de caractère de zéro à la clé pour empêcher l'entrée numérique dans le composant d'édition.