begin
        iLen := High(arrLsYlJh);
        Inc(iLen);
        setLength(arrLsYlJh,iLen);
    end;
    
这样试试!

解决方案 »

  1.   

    使用好象有些错误。动态数组申请以后。你可以先设置它的长度。setLength(arrlsyljh, 10),在使用。也可以不设置长度使用。例如,
    arrLsYlJh[0].LdBh := strLdBh;
    arrLsYlJh[0].WzDm := strWzDm;
    arrLsYlJh[0].Sl := dSl;
    也就是说,初始化下的动态数组长度是为0的。
      

  2.   

    procedure setArrayLsYlJh(strLdBh, strWzDm: String; dSl: Double);
    begin
        setlength(arrLsYlJh,length(arrLsYlJh)+1);
        arrLsYlJh[iLen-1].LdBh := strLdBh;
        arrLsYlJh[iLen-1].WzDm := strWzDm;
        arrLsYlJh[iLen-1].Sl  := dSl;
    end;
    这样好了!
      

  3.   

    上面的错了!!!!
    procedure setArrayLsYlJh(strLdBh, strWzDm: String; dSl: Double);
    var  
      Pos:integer;
    begin
        setlength(arrLsYlJh,length(arrLsYlJh)+1);
        Pos := High(arrLsYlJh);
        arrLsYlJh[Pos].LdBh := strLdBh;
        arrLsYlJh[Pos].WzDm := strWzDm;
        arrLsYlJh[Pos].Sl  := dSl;
    end;
      

  4.   

    我知道问题所在了。
    原因是High返回的是数组的最大索引号。
    实际记录是最大索引号+1,所以如果要记录加1 的话,需要High()+2,才是新数。
    楼上的Length方法是不可行的。
    谢各位
      

  5.   

    改正
    procedure setArrayLsYlJh(strLdBh, strWzDm: string; dSl: Double);
    var
      iLen: Integer;
    begin
      if High(arrLsYlJh) = -1 then //
        begin
          // 初始化以1前,High(arrLsYlJh)是为-1的(动态数组可用0下标)。
          iLen := 1;
        end
      else
        begin
          //此时再用 ILen := High(arrLsYlJh); 使ILen总是返回0,造成循环
          iLen := High(arrLsYlJh) + 1; // 这是正确的用法
          Inc(iLen);
        end;
      setLength(arrLsYlJh, iLen);
      // 初始化为1后,SetLength(arrLsYlJh, 1)使数组长度为1,High(arrLsYlJh)返回为0,  arrLsYlJh[iLen - 1].LdBh := strLdBh;
      arrLsYlJh[iLen - 1].WzDm := strWzDm;
      arrLsYlJh[iLen - 1].Sl := dSl;
    end;