在task.pas中定义一个类TTask,并定义一个TTask类型的对象数组tasks
type TTask = class(TObject)
       Status: string;
       SourceName: string;
       SourceSize: integer;
       SourceType: string;
       DestName: string;
       DestSize: integer;
       DestType: string;       procedure Convert();
     end;
var
 tasks: array of TTask;在unit1.pas中对数组tasks[]的各个对象的每一个成员赋值:
unit1.pas:  SetLength(Tasks,5);
  for i:=1 to 5 do
  begin
    if not assigned(Tasks[i]) then
    Tasks[i] := TTask.Create();
    Tasks[i].Status := 'Wait';
    Tasks[i].SourceName := StringGrid1.Cells[1,i];
  end;但是这样做编译的时候没问题,运行有错,又是Access violation的错误,我跟踪调试的时候发现i=1的时候过去了,循环到i=2的时候马上出错(if判断为false,也就是跳过了Tasks[2] := TTask.create.).我怀疑是数组上出错了,请问有对象数组的用法么? 该怎么修改呢?请赐教.

解决方案 »

  1.   

    SetLength(Tasks,5);
      for i:=0 to 4 do
    ...其它沒見有什麼明顯錯誤
      

  2.   

    释放的代码呢?在释放后要把Tasks[i]:=nil。
    否则if not assigned(Tasks[i]) then 是false
      

  3.   

    循环还没有结束,还没到释放的时候呢.我的想法是先将对象数组赋值,然后对他们进行处理,完了再释放.可是上面的代码只能对tasks[1]的成员赋值.其他的根本没有create.我将if 测试条件去掉以后运行没有错
    if not assigned(Tasks[i]) then
    这句话错在哪里?
      

  4.   

    将循环改为:
    for i:=0 to 4 do
    运行通过,谢谢aiirii(ari-爱的眼睛) .
    不过还是不解,我定义的是动态数组,开始下标也是由我来定的呀
      

  5.   

    调用动态数组时最好用: for i:=low(Tasks) to High(Tasks) do
    循环到i=2的时候马上出错: 你查一下StringGrid1.Cells[1,i]是否有问题,或者
    可能与你的系统有关,在我机子上是可以的
      

  6.   

    存储对象不如用
    Tlist
      

  7.   

    for i:=Low(Tasks) to High(Tasks) do
      begin
        if not assigned(Tasks[i]) then
        Tasks[i] := TTask.Create();
        Tasks[i].Status := 'Wait';
        Tasks[i].SourceName := StringGrid1.Cells[1,i];//这一句注意一下,StringGrid是多大的?
      end;
      

  8.   

    动态数组a:array of TypeName; 下标总是从0开始
    SetLength(a,n)所以用的时候0..n-1,记好了
    安全的写法是 for i:=Low(a) to High(a) do 
    释放的时候  for i:=High(a) downto Low(a)  do //尤其是在List里面