Fermer Types d'enregistrements permettant de récupérer directement les paramètres des messages.

UTILISATION DES TYPES D'ENREGISTREMENTS PERMETTANT DE RECUPERER DIRECTEMENT LES PARAMETRES DES MESSAGES

 

Delphi nous met à disposition des types d'enregistrements permettant de récupérer directement les paramètres des messages (sans passer par des transtypages).

Ces types sont déclarés dans l'unité message.pas (Si vous le possédez, allez voir le source de message.pas )

Par exemple, le type TWMMouse permettra de récupérer la position de la souris en x (XPos) et en y (YPos) lors de la réception du message WM_LBUTTONDOWN

 TWMMouse = record
    Msg: Cardinal;
    Keys: Longint;
    case Integer of
      0: (
        XPos: Smallint;
        YPos: Smallint);
      1: (
        Pos: TSmallPoint;
        Result: Longint);
  end;

Comment utiliser ces types ?

Exemple : on cherche à limiter la dimension mini et maxi de la fenêtre de notre application lorsque l'utilisateur la redimensionne. On sait (ou je vous apprends) que dans un tel cas, des messages WM_GETMINMAXINFO sont émis. En faisant une recherche (par exemple sur les caractères GETMINMAXINFO) dans le source message.pas (oui je sais, tout le monde ne l'a pas) On trouve le type TWMGetMinMaxInfo

TWMGetMinMaxInfo = record
  Msg: Cardinal;
  Unused: Integer;
  MinMaxInfo: PMinMaxInfo; // MinMaxInfo va nous permettre de limiter les dimensions de la fenêtre
  Result: Longint;
end;

et en faisant une recherche dans le source de l'unité windows.pas, on trouve la déclaration de PMinMaxInfo


// Struct pointed to by WM_GETMINMAXINFO lParam
PMinMaxInfo = ^TMinMaxInfo;// pointeur sur le type TMinMaxInfo
TMinMaxInfo = packed record
  ptReserved: TPoint;
  ptMaxSize: TPoint;
  ptMaxPosition: TPoint;
  ptMinTrackSize: TPoint; // largeur et hauteur mini de la fenêtre
  ptMaxTrackSize: TPoint; // largeur et hauteur maxi de la fenêtre
end;

rapel : de la déclaration de TPoint:

type TPoint = record
  X: Longint; // largeur 
  Y: Longint; // hauteur
end;

 


Ouvrez un nouveau projet et ajoutez y un TCheckBox

 

Ajoutons dans la partie private de la déclaration du type TForm1 :

  private
    procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; // le nom de la procédure est à notre libre choix

Cela signifie à Delphi que lorsqu'un message WM_GETMINMAXINFO sera émis vers notre Form1, la procédure WMGetMinMaxInfo sera déclenchée.

 

Implémentons notre procédure WMGetMinMaxInfo

procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
  inherited; // Traitement habituel du message WM_GETMINMAXINFO
  if CheckBox1.Checked then // Si limitation de taille demandée
    with Msg.MinMaxInfo^ do // avec la variable pointée par le pointeur Msg.MinMaxInfo (variable de type TMinMaxInfo)
    begin
      ptMinTrackSize.x:= 250; // largeur mini 250 pixels // équivalent à Msg.MinMaxInfo^.ptMinTrackSize.x:= 250 
      ptMinTrackSize.y:= 150; // hauteur mini 150 pixels
      ptMaxTrackSize.x:= 400; // largeur maxi 400 pixels
      ptMaxTrackSize.y:= 400; // hauteur maxi 300 pixels
    end;
end;

Testez votre programme ..

Source du programme

 

retour au sommaire