发送方:Form2const
  WM_MyMessage = WM_User + 2000;procedure TForm2.btnlClick(Sender: TObject);
var
  blmsg: array[0..3] of string;
  List: TStringList;
begin
  blmsg[0]:='test1';
  blmsg[1]:='test2';
  blmsg[2]:='test2';
  blmsg[3]:='test3';  List := TStringList.Create;
  List.Add(blmsg[0]);
  List.Add(blmsg[1]);
  List.Add(blmsg[2]);
  List.Add(blmsg[3]);
  //ShowMessage(List.Strings[2]);  SendMessage(Form1.Handle, WM_MyMessage, 0,  LongInt(List));
  List.Free;  Close;
end;接收方:Form1//自定义消息声明
const
  WM_MyMessage = WM_User + 2000;    procedure MyMessage(var msg: TMessage); message WM_MyMessage;......................
procedure TForm1.MyMessage(var msg: TMessage);
var
  getbllist: TStringList;
begin
  getbllist := TStringList.Create;
  getbllist.Assign(TStrings(Msg.WParam));
  Application.MessageBox(PChar(getbllist.Strings[2]), '提示', MB_OK + MB_ICONINFORMATION);
  TStrings(Msg.WParam).Free;
  getbllist.Free;
end;
上述代码编译通过,但运行时出错,提示“Cannot assign a nil to a TStringList”
请问是什么问题?该如何修改呢 ?

解决方案 »

  1.   

    首先 SendMessage(Form1.Handle, WM_MyMessage, 0,  LongInt(List)); 错位了应该是 SendMessage(Form1.Handle, WM_MyMessage, LongInt(List),  0);第二,再改过程:
    procedure TForm1.MyMessage(var msg: TMessage);
    var
      getbllist: Pointer;
    begin
      integer(getbllist):= Msg.WParam;
      Application.MessageBox(PChar(TStrings(getbllist).Strings[2]), '提示', MB_OK + MB_ICONINFORMATION);
    end;
      

  2.   

    不行哦...dinoalex兄,你的代码我看不懂啊1、getbllist定义成Pointer型的,怎么后来在Application.MessageBox又可以这样用TStrings(getbllist).Strings2、同样是编译通过,运行出错,提示出错行为:
      Application.MessageBox(PChar(TStrings(getbllist).Strings[2]), '提示', MB_OK + MB_ICONINFORMATION);
      

  3.   

    你加这句TStrings(Msg.WParam).Free;肯定出错,因为你已经Free过了
      

  4.   

    //发送 WM_COPYDATA 消息可以发送字符串信息,方法如下
    //发送端 参数:接收端的句柄、发送的字符串
    procedure TForm1.SendData(AHandle: THandle; AStr: String);
    var
     sData: TCopyDataStruct;
    begin
     sData.cbData := Length(AStr) + 1;
     GetMem(sData.lpData,sData.cbData );    //为传递的数据区分配内存
     StrCopy(sData.lpData,PChar(AStr)); SendMessage(AHandle,WM_COPYDATA,Handle,Cardinal(@sData)); // 发送WM_COPYDATA消息
     FreeMem(sData.lpData); //释放资源
    end;//接收端
    public
     procedure WMCOPYDATA(var AMsg: TWmCopyData);message WM_COPYDATA;procedure TForm1.WMCOPYDATA(var AMsg: TWmCopyData);
    begin
     ShowMessage(StrPas(AMsg.CopyDataStruct^.lpData));
    end; 
      

  5.   

    SQLDebug_Fan兄,你给的代码我看过,但这个是发一个字符串的,我是想发数组的同时我想过利用循环来发送,可惜不成功
      

  6.   

    procedure TForm1.MyMessage(var msg: TMessage);
    var
      getbllist: TStringList;
      i:integer;
    begin
      getbllist:=TStringList(Msg.WParam);
      for i := 0 to getbllist.Count - 1 do
         Application.MessageBox(PChar(getbllist.Strings[i]), '提示', MB_OK + MB_ICONINFORMATION);
    end;
      

  7.   

    var
      blmsg: array[0..3] of string;
      List: TStringList;
    begin
      blmsg[0]:='test1';
      blmsg[1]:='test2';
      blmsg[2]:='test2';
      blmsg[3]:='test3';
      List := TStringList.Create;
      List.Add(blmsg[0]);
      List.Add(blmsg[1]);
      List.Add(blmsg[2]);
      List.Add(blmsg[3]);
      SendMessage(Form1.Handle, WM_MYMESSAGE, LongInt(List){注意这个才是WParam参数},0);
      List.Free;
    end;
      

  8.   

    我靠~ 你没看我在一楼写的,sendmessage的参数错位了??