我定义了一个动态数据,然后往数组里面填东西,填完后马上访问数组有数据(填数据与访问数据在同一个方法内),但如果在另一个方法内访问数组却出错,经测试数组的长度变为0,我改用静态数组,没有上述问题,调试了很久,不得其解,实在郁闷,不知哪位高手能赐教!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Array1: array of Integer;
    begin
      SetLength (Array1, 100);
      for I := Low (Array1) to High (Array1) do
        Array1 [I] := I;
    end;
      

  2.   

    首先按IFindit说的检查。
    另外,是单线程的程序吧?
      

  3.   

    今天作了非常很详细的测试,发现数组初始化放在一般的方法内不会有问题,但放在复写的方法内就有问题,相关代码如下,代码给的不是很全,请见谅。但总之通过测试发现这种情况发生的很特殊,不是一般情况都能碰到,算我走运了。
    unit Unit2;interface
    uses
      Classes, SOAPHTTPClient, StrUtils, DBClient, XMLDoc, XMLIntf, DB, SysUtils,
      Variants, Dialogs;type
      TMyHTTPRIO = class(THTTPRIO)
      public
        fArray: array of string;
        procedure setArray;
      protected
        procedure DoAfterExecute(const MethodName: string; Response: TStream); override;
      end;implementationprocedure TMyHTTPRIO.setArray;
    var
      i: integer;
    begin
      for i:=0 to 2 do
      begin
        setLength(fArray, length(fArray)+1);
        fArray[length(fArray)-1] := 'test';
      end;
    end;procedure TMyHTTPRIO.DoAfterExecute(const MethodName: string; Response: TStream);
    begin
      setArray;
      inherited DoAfterExecute(MethodName, Response);
    end;end.
    这是一个关于WebService的程序,在接受到Service返回的数据后初始化数组,DoAfterExecute执行完后通过调试就会发现数据的长度变成无限大(反正很大,不正常),且数据都为空(‘’)
      

  4.   

    另外,因为任务时间紧,我已改用TObjectList了,好用多了,这样也可以证明我的程序没有错误,但不知是什么原因产生这样的问题。还有,上面的程序如改用静态数组就没有这样的问题,这也可以证明我的程序没有错误,但静态不是我想要的!
      

  5.   

    public
        fArray: array of string;一个类中的公开变量
      

  6.   

    setLength(fArray, length(fArray)+1);
    总觉得有问题,length(fArray)+1可以确定多少吗。
      

  7.   

    我终于知道是怎么回事了,在实例化TMyHTTPRIO 时,也就是:
    myhttprio := TMyHTTPRIO.Create(self);时一定要在Create中写self,我之前写的nil,所以产生了上面的错误,我是无意中发现的!然后用myhttprio.fArray去访问就没有错误了。
    我只是还是弄不明白为什么一定要指定为self,我以前习惯用nil,看来一个小的疏忽换来大麻烦,以后决定改变习惯写self。
    不过还请高手帮忙指点一下,为什么会有这种现象?