SetLength用来定义对象长度,如果要将a[4]删除的话同样要手工将前后的元素衔接起来,我想一样是很麻烦的。使用TList加动态控件数组可以很好的对自己创建的对象进行管理,是个不错的选择。不过释放资源的工作仍要自己来完成。但是我建议,最复杂的可能是最有效率的。

解决方案 »

  1.   

    您能否告知哪能找到Tlist应用的源码呢?
      

  2.   

    另外。问您一个简单问题。在delphi中,创建一个类是用New吗?
      

  3.   

    创建一个类用TTank.Create方法。aTank := TTank.Create;TList.Add( TTank.Create );Delphi中有一个类叫TObjectList,可以帮你释放内存。
    如ObjList.Delete( i ),不仅把这个位置删除,还会释放在这个位置的对象。
      

  4.   

    用动态数组应该是最容易的。
    或 Tlist
      

  5.   

    关于增删请参考 TList 的原程序
      

  6.   

    To AP:
     您能否详细说说如何使用动态数组
    To agui
      在delphi中,任何一个类都派生自TObject吗?他们都有Create方法吗,如果不是,其他的非派生自Tobject的类如何创建。
    aTank := TTank.Create;TList.Add( TTank.Create );
    这两句是独立的吗?还是应该TList.Add(aTank);
      

  7.   

    应该是aTank := TTank.Create;
    //....
    TList.Add( TTank );在TList中只是添加了一个指向对应TTank实例的指针;
      

  8.   

    TOBject是所有类的基类,就象VC中的COBject一样。所有类都是COBject中派生出来的,都应该有构造函数和析构函数的。使用动态数组:
    procedure myBtnclick(Sender: TObject);//自定义按钮事件var btnArr : array of TButton;
        i:integer;//........
    begin
      SetLength(btnArr, 10);
      for i:=0 to 9 do begin
          btnArr[i] := TButton.Create(self);
          btnArr[i].Caption := 'xxx';
          //.....
          btnArr[i].OnClick := myBtnclick;  //定按钮事件过程
          btnArr[i].tag := i; //用于标识控件数组
      end;
    end;procedure myBtnclick(Sender: TObject);//跟据tag来判断按下了哪个数组按钮
    begin
      case TButton(sender).tag of 
        1:begin
            //.....按下了第一个按钮
          end;
        2:begin      end;
       //.................
      end;
    end;
      

  9.   

    但是使用动态数组是不是就不能随意删除和插入按钮了(指crob的例子而言)?
      

  10.   

    对不起,几天没来。上面的是随手写的,有些杂乱。应该是:aTank := TTank.Create;
    ObjList.Add(aTank);

    ObjList.Add( TTank.Create );正如Crob(我干嘛这么帅)所说,TObject是所有类的祖先类。
      

  11.   

    var
     I : Integer;
     Arr: Array of Object;
     ATank: TTankObj;
    begin
     SetLength(Arr, 10);
     For I := 0 to 9 do
     begin
      ATank := TTankObj.Create(...);
      Arr[I] := ATank;
     end;
    end;//Destroy
    For I := 0 to 9 do
    begin
     ATank := Arr[I];
     ATank.Free;
     Arr[I] := NIL;
    end;