菜鸟:关于指针的问题(200分)

  • 主题发起人 主题发起人 hikehilter
  • 开始时间 开始时间
H

hikehilter

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TMainFrm.CommPortReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
end;

如何将接收到的数据转换成字符串?用什么方法比较好!
就是把Buffer转换成字符串的形式。
这是一个COM口程序。
 
要PChar,指向Char的指针比较好,这是我个人的意见。我是这样用的
 
参考一下:
begin
ReceivedStr := StrAlloc(BufferLength + 1);
Move(Buffer, ReceivedStr, BufferLength);
ReceivedStr[BufferLength] := #0;

...
StrDispose(ReceivedStr);
end;
 
补充一下:
var
ReceivedStr: PChar;
 
你的数据其实就是BufferLength长度的Byte字节,也就相当于array [0..BufferLength - 1] of Byte,每个Byte都是一个ANSI,你可以声明一个PChar的变量,将Buffer的指针给这个变量,就可以访问了,但是要注意,我们都知道Pchar是以0结尾的字符串,如果Pointer指向的内存长度为BufferLength的区域中包含了#0,PChar到String的转换将到#0这个位置结素,也就是说Edit1只能显示#0以前的内容如果要把Buffer中的字符完整地读取到一个string中,完善的处理办法是这样的:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: PChar;
str1: string;
i: integer;
begin
str := Buffer;
str1 := ''; SetLength(str1, BufferLength);
for i:=1 to BufferLength do str1 := (str+i-1)^;
end;
 
如果你要字符串,我觉得如下比较好。

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var s: string;
begin
SetLength(s, BufferLength);
Move(Buffer^, s[1], BufferLength);
.... // 你可以开始处理s了
Finalize(s);
end;
 
多人接受答案了。
 
后退
顶部