Fermer envoi d'un message entre applications : passage d'un record

GERER LES MESSAGES WINDOWS

MESSAGE ENTRE APPLICATIONS :
ENVOI D'UN RECORD, D'UN TABLEAU...

Dernière mise à jour : 08/10/02

leçon précédente (à regarder pour comprendre ce tutorial)

 

Principe général

Windows met à notre disposition un message particulier WM_COPYDATA qui va nous permettre d'envoyer l'adresse où se trouve nos données.

Dans ce message, le paramètre LPARAM contiendra l'adresse d'une structure de type TCopyDataStruct. Elle même contiendra l'adresse où se trouvent nos données.

 

D'où les codes suivants :

Application émétrice du message :

unit Unit1EnvoiMessage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, 
  Forms, Dialogs, StdCtrls, Spin, ExtCtrls;

type
  TForm1 = class(TForm)
    ButtonEnvoieMessage: TButton;
    Panel1: TPanel;
    Label1: TLabel;
    EditTexteAEnvoyer: TEdit;
    Label2: TLabel;
    SpinEditNombreAEnvoyer: TSpinEdit;
    procedure FormCreate(Sender: TObject);
    procedure ButtonEnvoieMessageClick(Sender: TObject);
  private
    NumMessage : UINT;// num de notre message
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


Type
TDataEnvoyes =Packed record  //packed pour "compressé"
  UnEntier:Integer;// on met ce que l'on veut dans le record
  UneChaine:String[255];
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  NumMessage:=RegisterWindowMessage('Message perso de application');
end;

procedure TForm1.ButtonEnvoieMessageClick(Sender: TObject);
var
  h:THandle;
  DataEnvoyes:TDataEnvoyes;
  CopyDataStruct:TCopyDataStruct;
begin
  DataEnvoyes.UnEntier:=SpinEditNombreAEnvoyer.Value;
  DataEnvoyes.UneChaine:=EditTexteAEnvoyer.Text;
  //taille des données à envoyer :
  CopyDataStruct.cbData:=SizeOf(DataEnvoyes);
  //adresse de nos données à envoyer :
  CopyDataStruct.lpData:=@DataEnvoyes; 

  h:=FindWindow(nil,'Fenêtre réceptrice de messages');
  //envoie de l'adresse (le @) du TCopuDataStruct
  //LPARAM est du type longInt d'où le transtypage LongInt()
  SendMessage(h, WM_COPYDATA,Handle,LongInt(@CopyDataStruct));
end;

end.

 

Application réceptrice du message :

(Pour mieux comprendre, revoir la leçon "Procédure propre à un message")

unit Unit1ReceptionMessage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    EditReceptionTexte: TEdit;
    SpinEditReceptionNombre: TSpinEdit;
    procedure FormCreate(Sender: TObject);
  private
    NumMessage : UINT;// num de notre message
  public
    // procedure qui sera déclenchée lorsqu'un message WM_COPYDATA arrivera
    procedure OnWmCopyData(var msg:TMessage); message WM_COPYDATA;
  end;

var
  Form1 : TForm1;

implementation

{$R *.DFM}
Type
//TPDataEnvoyes est un type pointeur (adresse) sur un TDataEnvoyes :
TPDataEnvoyes=^TDataEnvoyes;
TDataEnvoyes =Packed record
  UnEntier:Integer;
  UneChaine:String[255];
end;


procedure TForm1.OnWmCopyData(var msg: TMessage);
// procedure qui sera déclenchée lorsqu'un message WM_COPYDATA arrivera
type
  TPCopyDataStruct=^TCopyDataStruct;
  TPDataEnvoyes=^TDataEnvoyes;
Var
  DataEnvoyes:TDataEnvoyes;
  PDataEnvoyes:TPDataEnvoyes;
  PCopyDataStruct:TPCopyDataStruct;
begin
  PCopyDataStruct:=TPCopyDataStruct(msg.LParam);
  //PCopyDataStruct^ signifie "ce qui est pointé par le PCopyDataStruct"
  PDataEnvoyes:=PCopyDataStruct^.lpData;
  DataEnvoyes:=PDataEnvoyes^;

  EditReceptionTexte.Text:=DataEnvoyes.UneChaine;
  SpinEditReceptionNombre.Value:=DataEnvoyes.UnEntier;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NumMessage:=RegisterWindowMessage('Message perso de application');
  Form1.Caption:='Fenêtre réceptrice de messages';
end;
end.

 

source de l'exemple.

retour au sommaire