Delphi est un outil de développement de logiciels visuels orienté objet de Borland Company. Delphi combine les avantages de Visual C++ et de Visual Basic : facile à utiliser, puissant et présente des avantages uniques, notamment dans la conception d'interfaces, la programmation de bases de données et la programmation réseau.
Messages en Delphes
Un message est une notification envoyée par Windows qui indique à une application qu'un événement s'est produit. Dans Delphi, dans la plupart des cas, les messages Windows sont encapsulés dans des événements VCL. Cependant, si nous devons écrire nos propres contrôles, intercepter ou filtrer les messages, nous devons nous plonger dans le mécanisme de traitement des messages.
Dans Delphi, les messages sont définis sous la forme d'enregistrements TMessage. Ouvrez le fichier Message.pas, on voit que Tmessage est défini comme ceci :
taper
TMessage = enregistrement compressé
Message : Cardinal ;
cas Entier de
0 : (WParam : entier long ;
LParam : entier long ;
Résultat : entier long);
1 : (WParamLo : Mot ;
WParamHi : Mot ;
LParamLo : Mot ;
LParamHi : Mot ;
RésultatLo : Mot ;
RésultatSalut : Word );
fin;
Parmi eux, Msg est une valeur constante différente des autres messages. Ces valeurs constantes peuvent être des constantes prédéfinies en unités Windows ou des constantes définies par l'utilisateur. Wparam est généralement une valeur constante liée à un message, ou il peut s'agir d'un handle vers une fenêtre ou un contrôle. LParam est généralement un pointeur vers les données en mémoire.
Le résultat est la valeur de retour du traitement du message. Wparam, Lparam et Result sont tous 32 bits. Si vous souhaitez accéder aux 16 bits inférieurs ou aux 16 bits supérieurs, vous pouvez utiliser respectivement WparamLo, WparamHi, LParamLo, LparamHi, ResultLo et ResultHi.
En plus du Tmessage général, un enregistrement de message spécial est défini pour chaque fenêtre dans Delphi. On peut parcourir le fichier Message.pas, et voici l'enregistrement du message clavier :
TWMKey = enregistrement compressé
Message : Cardinal ;
CharCode : Mot ;
Inutilisé : Word ;
Données clés : entier long ;
Résultat : entier long ;
Les messages liés au clavier tels que : les enregistrements WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP et WM_SYSCHAR sont également définis comme TWMkey. Il y a l'instruction suivante dans le fichier Message.pas :
TWMChar=TWMkey; TWMKeyDown=
Clé TWM ; TWMKeyUp = Clé TWM ;
-KeyDown=TWMkey; TWMSysKeyUp=
TWMkey;TWMSysChar=TWMkey;
envoi de messages
Le traitement des messages consiste à définir la manière dont l'application répond aux messages Windows. Dans Delphi, chaque message a son propre processus de traitement. Il doit s'agir d'une méthode dans un objet et ne peut transmettre qu'un seul Tmessage ou autre enregistrement de message spécial. Il doit y avoir une commande de message après la déclaration de la méthode, suivie d'un message allant de 0. à Constant entre 32767.
Les messages que nous avons mentionnés précédemment sont tous des messages Windows standard (WM_X). De plus, il existe des messages internes à la VCL, des messages de notification et des messages définis par l'utilisateur.
Les messages internes de la VCL commencent généralement par "CM_" et sont utilisés pour gérer les éléments à l'intérieur de la VCL. Si vous modifiez la valeur d'une propriété ou d'autres caractéristiques d'un composant, vous devez informer les autres composants de la modification via des messages internes. Par exemple, le message d'activation du focus d'entrée est envoyé à un composant activé ou désactivé pour accepter ou abandonner le focus d'entrée.
Il existe également des messages de notification. Quelque chose arrive à un contrôle enfant dans une fenêtre et la fenêtre parent doit être notifiée via des messages de notification. Il ne fonctionne qu'avec les contrôles de fenêtre standard, tels que les boutons, les zones de liste, les zones d'édition, etc. Ouvrez le fichier Message.pas Après le Windows standard se trouve la déclaration du message de notification :
const
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0 ;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1 ;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2 ;
Ce qui précède sont les messages de notification du bouton, qui indiquent respectivement que l'utilisateur a cliqué sur le bouton, que le bouton doit être redessiné et que l'utilisateur a mis le bouton en surbrillance.
Les utilisateurs peuvent également définir leurs propres messages, s'envoyer des messages et rédiger des procédures de traitement des messages. La valeur constante du message est WM_USER+100 à $7FFF. Cette plage est réservée par Windows aux messages définis par l'utilisateur.
Il existe trois méthodes pour envoyer des messages Delphi :
1. Exécuter la méthode objet de la classe Tcontrol. Vous pouvez envoyer des messages à n’importe quel formulaire ou contrôle, il vous suffit de connaître l’instance du formulaire ou du contrôle. Sa déclaration est la suivante :
fonction Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Fonctions de l'API Windows SendMessage() et Postmessage(). Sa déclaration est la suivante :
fonction SendMessage(hWnd : HWND ; Msg : UINT ; wParam : WPARAM ; lParam : LPARAM) : LRESULT ;
fonction SendMessage (hWnd : HWND ; Msg : UINT ; wParam : WPARAM ; lParam : LPARAM) : LRESULT ;
La fonction PostMessage ajoute un message à la file d'attente des messages de l'application. La boucle de messages de l'application extraira le message enregistré de la file d'attente des messages puis l'enverra à la fenêtre correspondante.
La fonction SendMessage peut envoyer des messages directement à la procédure de fenêtre via la file d'attente des messages. Ainsi, SendMessage est utilisé lorsque Windows doit renvoyer une valeur immédiatement, et PostMessage est utilisé lorsque différentes applications doivent traiter les messages en séquence. Perform est essentiellement similaire à SendMessage, ils sont envoyés directement à la procédure de fenêtre. Les fonctions SendMessage et Postmessage ont uniquement besoin de connaître le handle de la fenêtre pour envoyer des messages, afin de pouvoir envoyer un message à un formulaire non Delphi, mais Perform doit connaître l'instance du formulaire ou du contrôle.
Mécanisme de traitement des messages VCL
Il y a l'instruction application.Run dans le code source de l'application Delphi. Sa fonction est de démarrer la boucle de messages puis d'appeler Application.PRocessMessage. Cette fonction trouvera un message dans la file d'attente des messages de l'application. Lorsqu'un message est récupéré de la file d'attente des messages, l'événement Application.OnMessage est déclenché. De cette façon, avant que Windows ne traite lui-même le message, il répondra au traitement de l'événement OnMessage. Il est supérieur à tout traitement de message et ne reçoit que les messages enregistrés, c'est-à-dire les messages envoyés par PostMessage comme mentionné ci-dessus. Le processus de traitement qui répond à l'événement Application.OnMessage doit être de type TmessageEvent, déclaré comme suit :
tapez TMessageEvent = procédure (var Msg : TMsg ; var Handled : Boolean) de l'objet ;
Où TMsg est l'enregistrement de message défini dans Windows, nous pouvons le déclarer comme ceci :
Procédure OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Attribuez ensuite cette méthode à l'événement Application.OnMessage :
Application.OnMessage :=OnMyMessage;
L'événement OnMessage capturera tous les messages envoyés à l'application, ce qui est un événement très chargé, il n'est donc pas judicieux de définir des points d'arrêt pendant le traitement de l'événement OnMessage pour le traitement des messages.
La méthode utilisée par l'objet VCL pour recevoir des messages est appelée MainWndProc. Il s'agit d'une méthode statique définie dans la classe Twincontrol et ne peut pas être surchargée. Il ne traite pas le message directement. Lorsque le message quitte MainWndProc, le message est transmis à la méthode WndProc de l'objet. La méthode WndProc est une méthode virtuelle définie dans la classe Tcontrol, qui appelle la méthode Dispatch. Dispatch recherche la méthode de traitement correspondante en fonction du message entrant. S'il ne la trouve finalement pas, il continue de rechercher la méthode de traitement du message dans la classe parent jusqu'à ce qu'elle soit trouvée, s'il ne la trouve pas, il appelle Defaulthandler. La méthode Defaulthandler effectue le traitement final du message, puis transmet le message à la fonction Windows DefWindowProc ou à d'autres procédures de fenêtre par défaut.