用过SPOMM的兄弟进来看我一个语法!!(10分)

  • 主题发起人 主题发起人 nzfboy
  • 开始时间 开始时间
N

nzfboy

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我的程序在这段接受数据的过程中会出现内存不能写的错误?
procedure TfmMain.spcommReceiveData(Sender: TObject
Buffer: Pointer;
BufferLength: Word);
var
i,n:integer;
viewstring:string;
AllLen,DataLen:integer
begin
n:= BufferLength;//SizeOf(buffer);
setlength(rbuf,n);
viewstring:='';
move(buffer^,pchar(@rbuf)^, n);
for i:=1 to n do //bufferlength do
begin
viewstring:=viewstring+inttohex(rbuf,2)+'';
end

viewstring:='接收:'+viewstring+' ';
memo1.lines.add(viewstring);
memo1.lines.add('');
end;
 
为何改成如下就无问题。
procedure TfmMain.spcommReceiveData(Sender: TObject
Buffer: Pointer;
BufferLength: Word);
var
s: string;
begin
SetLength(S, BufferLength)
//接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
Memo1.Invalidate;
end;
 
好像关键在以下两句中。
注:rbuf:array of byte;


move(buffer^,pchar(@rbuf)^, n);
for i:=1 to n do //bufferlength do
begin
viewstring:=viewstring+inttohex(rbuf,2)+'';
end
 
rbuf:array of byte;
rbuf是从0开始的
for i:=0 to n-1 do
 
move(buffer^,pchar(@rbuf)^, n);
^^^
to
move(buffer^,pchar(rbuf)^, n);
^ 是取地址的意思,@也是取地址的意思,留一个即可。
 
多人接受答案了。
 

Similar threads

后退
顶部