var
  S: String;
begin
  SetLength(S,256);
  DragQueryFile(Msg.WParam,0,PChar(S),256);
  Showmessage(S);
  Memo.Text := S;
  Showmessage(Memo.Text);
  ......
end;为什么两个Showmessage显示不一样呢?
又没有Trim,请问Memo.Text := S;做了什么?

解决方案 »

  1.   

    前者分配了256个字节,showmessage时长度为256,而memo1.text赋值后就只有有效字符了。
    但前者又没有空格,是什么字符填充的呢?
      

  2.   

    是不是你MEMO属性设置不对呢?
    看看属性设置哦
      

  3.   

    delphi中的long string长度在 首字节偏移量=-4 的一个int32类型里记录,在SetLength之后内容是随机的
    TMemo是系统控件,它只接收c语言定义的字符串形式,也就是说遇到#0就认为该字符串结束了
      

  4.   

    按道理 showmessage() 显示的也是 #0 结尾的字符串啊楼主把两个不同的结果贴上来看看
      

  5.   

    var
      S: String;
    begin
      SetLength(S,256);
      DragQueryFile(Msg.WParam,0,PChar(S),256);
      SetLength(S, lstrLen(PChar(S)));
      Showmessage(S);
      Memo.Text := S;
      Showmessage(Memo.Text);
      ......
    end;这样就会一样了!!
      

  6.   

    var 
      S: String; 
    begin 
      SetLength(S,256); 
      DragQueryFile(Msg.WParam,0,PChar(S),256); 
      S := PChar(S);
      Showmessage(S); 
      Memo.Text := S; 
      Showmessage(Memo.Text); 
      ...... 
    end; 这样也会一样了!!
      

  7.   

    估计是设个断点在ide里看到的,显示出来的的确应该一样
      

  8.   


    不会一样的了!!Delphi的String是不管#0的,而Pchar是遇#0结束的!ShowMessage是纯Delphi的,Show的是string,而Memo.Text := string,其机制是API的SetWindowText(Handle, PChar(string))!简单地说,Delphi的string相当于Byte数组!如果不用Delphi的showmessage,而用API的MessageBox,那肯定一样了!