回 帖 发 新 帖 刷新版面

主题:[讨论]是高手的~~站出来说话```

procedure TfrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  tmpStr: Array [0..1000] of Char;
begin
  [color=0000FF]//SetLength(tmpStr,BufferLength);[/color]  
  Move(Buffer^,PChar((@tmpStr)^),BufferLength);

  if Memo1.Visible then begin
    Memo1.Lines.Clear;
    Memo1.Lines.Add(tmpStr);
  end;
  DO_GPSString(tmpStr,GPSR1);

  lblJD.Caption := GPSR1.LonHemi + FloatToStr(GPSR1.Lon);
  lblWD.Caption := GPSR1.LatHemi + FloatToStr(GPSR1.Lat);
  lblHB.Caption := IntToStr(Round(GPSR1.Alt));
  lblTime.Caption := GPSR1.UTC;
  pbxSat.Repaint;
end;
请问这段接收数据的代码那里有问题啊??为什么提示错误啊??
[Error] Main.pas(82): Constant object cannot be passed as var parameter
问题就出在蓝色字体部分~~~

回复列表 (共3个回复)

沙发

你这里的tempstr是一个静态分配好的数组,长度为1001;不能再通过setlength来对它进行设置长度.就象改变一个const类型的变量一样会带来错误!
可以通过定义tempstr: array of char;为动态数组来实现应该就没问题了

板凳

您的意思是这样改嘛??
procedure TfrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  tmpstr: array of char;
 // tmpStr: Array [0..1000] of Char;
begin
  SetLength(tmpStr,BufferLength);
  Move(Buffer^,PChar((@tmpStr)^),BufferLength);

  if Memo1.Visible then begin
    Memo1.Lines.Clear;
   [color=0000FF] Memo1.Lines.Add(tmpStr);[/color]
  end;
 [color=FF00FF] DO_GPSString(tmpStr,GPSR1);[/color]

  lblJD.Caption := GPSR1.LonHemi + FloatToStr(GPSR1.Lon);
  lblWD.Caption := GPSR1.LatHemi + FloatToStr(GPSR1.Lat);
  lblHB.Caption := IntToStr(Round(GPSR1.Alt));
  lblTime.Caption := GPSR1.UTC;
  pbxSat.Repaint;
end;
可这样会产生新的错误了!
[Error] Main.pas(88): Incompatible types: 'String' and 'dynamic array'
[Error] Main.pas(90): Incompatible types: 'String' and 'dynamic array'
[Fatal Error] MyGPS.dpr(8): Could not compile used unit 'Main.pas'
我是新手``请帮帮忙再解决一下吧```麻烦你了``

3 楼


老大,我虽然不知道你到底想实现什么,但是我看了你的程序后,发现
你调用memo1.lines.add(),这里面的参数应该是个字符串,你只需要把
tempstr定义成string就行了,然后再setlength,再copymemory,再lines.add(tempstr)就没问题了!还有如果你非要定义成数组的话,应该lines.add(tempstr[i])tempstr:array of string了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册