String的疑问

ss[1]//var ss:String;
和
Pointer(ss)^
是不是一个意思呢?
 
答:不是。
ss[1]表示第一个字符。如:ss:='abc'
则表示'a'。ss[0]=Length(ss);
Pointer(ss)^ 和 @s 也不一样。
就连 cc:PChar
Pointer(cc)^ 和 @cc 也不一样。
 
应用:
一、发送字符串 或者 Record
 
procedure SendStr(ss:String);
var cds:TCopyDataStruct;hh:HWND;
begin
  hh:=FindWindow('TfrmFYErpMsg',nil);
  if hh<>0 then
  begin
    //cds.dwData:=Handle;可要可不要
    cds.cbData:=Length(ss)+1;//不能漏掉+1
    cds.lpData:=AllocMem(cds.cbData);//GetMem(cds.lpData,cds.cbData);可替代
    StrCopy(cds.lpData,PChar(ss));
    SendMessage(hh,WM_COPYDATA,hh,Cardinal(@cds));
    FreeMem(cds.lpData);
  end;
end;
 
  TRR=Record
    a:String[20];
    b:PChar;//这里注意,不能使用PChar这种长度可变的。
    d:Double;
  end;
procedure SendRec(aa:TRR);
var cds:TCopyDataStruct;hh:HWND;
begin
  hh:=FindWindow('TfrmFYErpMsg',nil);
  if hh<>0 then
  begin
    cds.cbData:=sizeof(aa);
//    cds.lpData:=AllocMem(cds.cbData);//GetMem(cds.lpData,cds.cbData);
    cds.lpData:=@aa;
    SendMessage(hh,WM_COPYDATA,hh,Cardinal(@cds));
//    FreeMem(cds.lpData);不知道怎么要这个???
  end;
end;
 
二、接收
 
procedure RecordWM(var ARec:TWMCopyData);message WM_COPYDATA;
 
procedure TfrmFYErpMsg.RecordWM(var ARec: TWMCopyData);
var s:String;x:TRR;
begin
//字符串
  s:=StrPas(ARec.CopyDataStruct^.lpData);
//Record
  x:=TRR(ARec.CopyDataStruct.lpData^);
  s:=x.a+#9+x.b+#9+FloatToStr(x.d);
end;
View Code

原文地址:https://www.cnblogs.com/key-ok/p/3380399.html