现在有这样一个问题,我设置了一个控件数组,这个数组可以动态生成控件,用户可以随意添加并删除控件,但是数组里面删除一个元素之后,后面的元素没办法自动补充上去,有没有像链表一样的数据结构,可以让后面元素自动填充上去的呢?具体应该如何实现?先谢谢大家了

解决方案 »

  1.   

    用LIST保存控件的地址,控件释放的时候,LIST删除该地址
      

  2.   

    TList里面的元素可以是任意类型吗?能不能详细点?
      

  3.   

    可以的,里边其实就是个无类型指针数组 
    另外比普通数组多了个MOVE操作 
      

  4.   

    那我需要把两种不同类型的控件放到同一个数据结构里面,List是不是不可以了?
      

  5.   

    这种情况一般用TObjectList管理对象会更方便一些,即在释放TObjectList时会自动释放其内的对象,在添加时需要把类转为TObject类型而后Add;
    不太好办
     
      

  6.   

    TstringList只能存String吧?对我好像不太适用
      

  7.   

    addobject过程  也一样可以用于添加指针或是类对象
      

  8.   

    比如你要加一个button1进去:
    objList是TStringList
    添加:
    objList.addObject('btn1',Button1);取出:
    var btn:Tbuttion;
        idx:Integer;idx:=ObjList.IndexOf('btn1');//按名称取得ID
    if idx<>-1 then
    begin
      btn:=Tbuttion(objlist.Objects[idx]);
      //爱怎么处理怎么处理...
    end;
      

  9.   


    怎么判断呢?
    除了wzwcn怎么就没有人肯多写些代码了?我对这些数据结构都不太了解,不知道哪个更好,说TObjectList管理对象更好的人能不能像wzwcn一样举个例子?
      

  10.   

      private
        fList:TList;
        { Private declarations }
    procedure TForm1.Button1Click(Sender: TObject);
    var
      cb:TCheckBox;
      rb:TRadioButton;
    begin
      cb := TCheckBox.Create(nil);
      rb := TRadioButton.Create(nil);
      if Assigned(fList) then
      begin
        fList.Add(cb);
        flist.Add(rb);
      end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      fList := tlist.Create;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      i : Integer;
    begin
      for i:= 0 to flist.Count -1 do
      begin
        if (Tobject(fList.Items[i])  is TCheckBox) then
          TCheckBox(fList.Items[i]).Free
        else  if (TObject(fList.Items[i])  is TRadioButton) then
          TRadioButton(fList.Items[i]).Free;
      end;
      flist.Free;end;
      

  11.   

    明白你的意思了,那不用什么链表啊,比较你的按扭都是放Panel1上的,可以用下面的方法设置:
    var c:TControl;
        i:Integer;
    begin
      for i:=0 to Panel1.ControlCount-1 do
      begin
        c:=Panel1.Controls[i];
        if c is TCheckBox then//是复选框
        begin
          //处理..
        end
        else if c is TRadioButton then//是单选框
        begin
          //处理..
        end;
      end;
    end;
      

  12.   

    用Tlist可以更灵活
    PTNode = ^TNode;
    TNode = packed record
      id: integer;
      type: integer;
      ...
      object: Tobject;
    endTlist.add(PTNode);
    删除时记得释放
      

  13.   

    谢谢大家的帮助,在大家的开导下我已经解决了自己的问题。我用的是TobjectList,之所以选择它是因为听说它删除元素时可以同时释放对象,不需要再次手动释放对象,而TList好像做不到这点。而StringList在加入对象的同时还要加入一个字符串,感觉很麻烦,要找到对应的对象时也不是特别方便。
    我以前没有认真学过链表之类的数据结构,可能理解还有些偏差,有不对的地方还请大家多多指教。
    以下贴出我的解决办法,还望大家不吝赐教。TObjectList的用法
    1.定义
      var
        RadioList: TStringList;
     注:要添加引用单元Contnrs
    2.初始化
      FItems := TObjectList.Create;
    3.添加元素
      FItems.Add(cxCheckBox1);
      FItems.Add(cxRadioButton1);
      FItems.Add(cxRadioButton2);
    4.取出元素
    var
      check: TcxCheckBox;
      radio: TcxRadioButton;  check := TcxCheckBox(FItems[0]);
      radio := TcxRadioButton(FItems[1]);
    5.删除元素
      FItems.Delete(1);
    6.计算个数
    var
      n: Integer;  n := FItems.Count;