|
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
|