SendMessage(HD,101,LongInt(@sdData),0);
我在上边做了发送消息的函数,这样可以传数据结构类型。
数据结构是:
  TSendData = record
    CardNO: Cardinal;
    Msg: string;
  end;在接收方我要取到
  TSendData的字段的值,怎么做啊?也就是说怎么将整形再转成指针,或数据结构类型?

解决方案 »

  1.   

    首先 Msg:string不妥,要改为array [0..Max] of char发送端和接收端都要定义这个结构
    sendmessage时,传结构指针,接收时,将指针转为结构
      

  2.   

    procedure TMyClass.MyMessageProc(var Msg: TMessage); // message 101???
    var
      Data: ^TSendData;
    begin
      Data := Pointer(Msg.LParam);
      Data.xxxx := ....
      ...
    end;
      

  3.   

    接收时?怎样将指针转为结构啊?
    这是我不会的。
     if Message.Msg = WM_SendResultData then
      begin
        Message.WParam^.//就这不会
        RzEdit1.Text := Trim(message.wparam);///就这不会
      end
      else inherited;
      

  4.   

    var
      data: ^TSendData;
    begin
      data := Pointer(Msg.WParam);
      RzEdit1.Text := Trim(data^.msg);
    end;
      

  5.   

    不行啊,指针没分配会报错啊。
    我这样写的但是没有值为什么啊?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
      

  6.   

    你定义的时候写法不对。加上这句:pTSendData = ^TSendData;
    实际上你就是想写一个自定义消息传一个结构体过去。下面给你详细写一个例子,浪费了我一定时间,别忘了给分!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.
      

  7.   

    自定义消息
    WM_MSG=WM_USER+101;  //大于100即可好像type   
      TSendData = record
        CardNO: Cardinal; 
        Msg: string; 
      end;SendMessage(Handle,WM_MSG,0,@TSendData);//先把你要传的数据,放在record里,然后传record的地址取的时候,根据地址来取就行,两个程序里定义了相同的消息与record不用管取多少了另外,你也可以zeromemory,传址来取值
      

  8.   

    两个程序间发消息的列子总结
    由于我的代码都贴出来没啥用,所以将重要部分归纳了一下,贴出来,然后结贴。
    大家可以互相学习。在此先谢谢各位朋友给的帮助。发消息方:
    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;