在DELPHI2010下使用SetLength函数初始化一个字符型变量后,奇怪这个字符变量有就内容了!
var
  ComRev:string;//接收到的字符串
begin
  //在运行下面这一行语句前测试ComRev的值是‘’空的,
  setlength(ComRev, BufferLength);
  //但是在执行完上面这行语句后,ComRev变量有就内容了,而且内容很奇怪,有时是某个控件的CAPTION属性值,有时是某个控件的名称等。
  ......
end;     请教各位有没有遇到过这个问题?能是什么原因?如何解决?

解决方案 »

  1.   

    string改成AnsiString,2010的string是unicode编码,和D7不一样了
      

  2.   

    内存记忆?setlength是申请内存的,有时申请的内存会有上次使用的记忆?这个说法能成立吗?哈哈
      

  3.   

    那么请教我是否需要将程序中所有定义的STRING类型的变量名称全部改为ANSISTRING呢?
    还有我刚才将类型改过后,在使用setlength后,这个变量一样会有内容,不过内容不一样了,全变成了ANSI码
      

  4.   

    就按我说的理解吧.哇哈哈不过自己写代码认真管理一下string变量可能就不会有了
      

  5.   

    分配的内存没有清空之前的内容,用FillChar重新清空下。
      

  6.   

    下面是我的程序代码,我按你们说的方法都试了,还是不行,如果用FILLCHAR把COMREV的内容清空,刚MOVE过程就会报内存错误。如果不清空,在运行SETLENGTH后COMREV中就会奇怪地出现许多内容。
    procedure TMainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      ComRev:AnSiString;//接收到的字符串
    begin
      //sleep(200);
      setlength(ComRev, BufferLength);
      FillChar(comrev,sizeof(comrev),0);
      Move(Buffer^, PChar(ComRev)^, BufferLength);
      if ComRev<>'' then
        begin
          strtmp:=trim(ComRev);
          statusbar.Panels[5].Text:=strtmp;
          memo1.Lines.Add(strtmp);
          statusbar.Panels[3].Text:='正常';
          if (length(strtmp)>=7) and (strtmp[1]<>'A') then
            begin
              if FCService=nil then
                FCService:=tFCService.Create(application);
              FCService.edit1.Text:=strtmp;
              FCService.bitbtn7.Click;
              FCService.ShowModal;
            end;
        end
      else
        statusbar.Panels[3].Text:='未联接';
    end;
      

  7.   

    Move(Buffer^, ComRev[1],BufferLength);这样呢,不过建议你接收数据类型用字节是数值或array of AnsiChar类型
      

  8.   

    虽然不知道是为什么,不过按照  bdmh  的方法,我把类型变成array[1..20] of byte 类型,然后再根据长度只计算长度范围内的,范围外的不管它。这样也算解决了。
    修改后的代码如下:
    procedure TMainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      ComRev:array[1..20] of byte;
      i:integer;
    begin
      Move(Buffer^, PChar(@ComRev[1])^, BufferLength);
      if bufferlength>0 then
        begin
          for i := 1 to bufferlength do
            strtmp:=strtmp+chr(comrev[i]);
          strtmp:=trim(strtmp);
          statusbar.Panels[5].Text:=strtmp;
          memo1.Lines.Add(strtmp);
          statusbar.Panels[3].Text:='正常';
          if (length(strtmp)>=7) and (strtmp[1]<>'A') then
            begin
              if FCService=nil then
                FCService:=tFCService.Create(application);
              FCService.edit1.Text:=strtmp;
              FCService.bitbtn7.Click;
              FCService.ShowModal;
            end;
        end
      else
        statusbar.Panels[3].Text:='未联接';
    end;
      

  9.   

    FillChar(comrev,sizeof(comrev),0);
    这么明显的错误都看不出来