SendMessage(HD,101,LongInt(@sdData),0);
我在上边做了发送消息的函数,这样可以传数据结构类型。
数据结构是:
TSendData = record
CardNO: Cardinal;
Msg: string;
end;在接收方我要取到
TSendData的字段的值,怎么做啊?也就是说怎么将整形再转成指针,或数据结构类型?
我在上边做了发送消息的函数,这样可以传数据结构类型。
数据结构是:
TSendData = record
CardNO: Cardinal;
Msg: string;
end;在接收方我要取到
TSendData的字段的值,怎么做啊?也就是说怎么将整形再转成指针,或数据结构类型?
sendmessage时,传结构指针,接收时,将指针转为结构
var
Data: ^TSendData;
begin
Data := Pointer(Msg.LParam);
Data.xxxx := ....
...
end;
这是我不会的。
if Message.Msg = WM_SendResultData then
begin
Message.WParam^.//就这不会
RzEdit1.Text := Trim(message.wparam);///就这不会
end
else inherited;
data: ^TSendData;
begin
data := Pointer(Msg.WParam);
RzEdit1.Text := Trim(data^.msg);
end;
我这样写的但是没有值为什么啊?procedure TMainForm.WndProc(var Message: TMessage);
var
pData: PSendData;
begin
if Message.Msg = WM_SendResultData then
begin
New(pData);
FillChar(pData^,SizeOf(pData^),#0);
pData := Pointer(message.WParam);
RzEdit1.Text := Trim(pData^.msg);
Dispose(pData);
end
else inherited;
end;
难道要用WM_COPYDATA
实际上你就是想写一个自定义消息传一个结构体过去。下面给你详细写一个例子,浪费了我一定时间,别忘了给分!unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
//定义消息索引号
const
WM_mymessage=WM_USER+$133;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Procedure myownermessage(var Msg: TMessage);message WM_mymessage;//stdcall; end;
type //定义结构体
pTSendData = ^TSendData; //这句很关键,没有这句就不能用指针引用了。
TSendData = record
CardNO: Cardinal;
Msg: string;
end;
var
Form1: TForm1;implementation{$R *.dfm}procedure Tform1.myownermessage(var Msg: TMessage);
var s : TSendData;
begin//得到消息的参数
s:=pTSendData(msg.LParam)^;
edit1.Text:=s.Msg;
edit2.Text:=inttostr(s.CardNO);
end;procedure TForm1.Button1Click(Sender: TObject);
var a : TSendData;
begin
a.Msg:='ssssssss';
a.CardNO:=88;
SendMessage(Handle,WM_mymessage,0,DWORD(@a));
end;end.
WM_MSG=WM_USER+101; //大于100即可好像type
TSendData = record
CardNO: Cardinal;
Msg: string;
end;SendMessage(Handle,WM_MSG,0,@TSendData);//先把你要传的数据,放在record里,然后传record的地址取的时候,根据地址来取就行,两个程序里定义了相同的消息与record不用管取多少了另外,你也可以zeromemory,传址来取值
由于我的代码都贴出来没啥用,所以将重要部分归纳了一下,贴出来,然后结贴。
大家可以互相学习。在此先谢谢各位朋友给的帮助。发消息方:
type
TCopyDataStruct = packed record
dwData: DWORD; // 条件
cbData: DWORD; // 信息长度 需要 + 1,加一个结束符的位
lpData: Pointer; // 数据指针,传送数据的地址
end;//发消息的函数
procedure TMainForm.Button1Click(Sender: TObject);
var
HD: THandle;
cdsCopyData: TCopyDataStruct;
begin
FillChar(cdsCopyData,SizeOf(cdsCopyData),#0);
cdsCopyData.dwData := 1;//需要执行的标志字段
cdsCopyData.lpData := PChar(Trim(edit1.text));
cdsCopyData.cbData := StrLen(PChar(Trim(edit1.text))) + 1;
HD := FindWindow(nil,'Form1');//'Form1'接收信息的窗口caption
if HD > 0 then
SendMessage(HD,WM_COPYDATA,LongInt(Self.handle),LongInt(@cdsCopyData));
end;收消息方:
procedure WMCcpyData(var Msg: TWMCopyData); message WM_COPYDATA;procedure TForm1.WMCcpyData(var Msg: TWMCopyData);
var
sText: array[0..1000] of Char;
begin
FillChar(sText,SizeOf(sText),#0);
StrLCopy(sText,msg.CopyDataStruct^.lpData,msg.CopyDataStruct^.cbData);//将复制过来的值给字符数组
case Msg.CopyDataStruct^.dwData of
1: Edit1.Text := Trim(sText);
2: ShowMessage(Trim(sText));
end;
end;