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

你可能感兴趣的:(String)