//根据TABSHEET.CAPTION来删除,如DestroyTabSheet('a1')
procedure DestroyTabSheet(Const TabSheetCaption:String)
var
  I: Integer;
  Temp: TComponent;
begin
  for I := ComponentCount - 1 downto 0 do  //查找所有控件
  begin
    Temp := Components[I];
    if (Temp is TTabSheet) then    //如果是TTABSHEET
    begin
      if (Temp As TTabSheet).Caption :=TabSheetCaption then  //是否要删除
      Begin
        (Temp As TTabSheet).Free;
        Exit;
      end;
    end;
  end;end;

解决方案 »

  1.   

    建立TabSheet数组:
      a1 : array[1..10] of TTabSheet;
    ...
      

  2.   

    还是用name判断比较好,因为创建时已经有name='a'+inttostr(i)
    所以只要判断(temp as Ttabsheet).name='a'+inttostr(i)即可.
      

  3.   

    TTabSheet.Create(tabsheet1) 创建的TTabSheet实例会随着tabsheet1的释放而释放,这就是参数Owner的含义之一。如果比较正规的写法,一般用TObjectList来存储每一个新创建的对象实例,最后通过释放TObjectList来释放所有对象,或者从List中删掉某一项来释放相应对象。
    如(示意,未经测试):objList := TObjectList.Create; with TTabSheet(TObjectList.Add(TTabSheet.Create(nil))) do 
    begin 
      ... 
    end; objList.Delete(0); 
    ...
    objList.FreeAndNil;
    ...
      

  4.   

    JGTM2000兄说的好,我也想到了,但是当我在formcreate中创建Tobjectlist时,总是提示出错?我是这样写的:
    在form的public中定义 tabsheetlist: TObjectList;
    在formcreate中创建:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        tablist.Create;
    end;
    运行出错提示:内存地址存取错误!
    可是怎么能错呢?就这么几行程序???
      

  5.   

    sorry: 我定义的是 tablist: Tobjectlist; 打错了:)
    但是出错!
      

  6.   

    还有一个问题:我的pagecontrol中含有多个动态生成的名字为'tabsheet'+inttostr(i)的tabsheet控件,每个tabsheet中又生成一个名字为‘listview‘+inttostr(i)的子控件,我可以通过pagecontrol.findchildcontrol(tabsheet's name)来得到某一个tabsheeti,她这个函数返回的是TControl类型,不能再通过它找属于该tabsheet的listview了,可是我要用它里面的listview, 怎么办?
      

  7.   

    这种情况只能用TObjectList吗?
      

  8.   

    1、定义ControlList:TList;
    2、在窗体creat事件中:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ControlList:=TList.Create;
    end;
    3、在你的代码中加入:
    for i:=0 to 10 do 
        begin 
          with TTabSheet.Create(tabsheet1) do
          begin
              PageControl:=PageControl1;
              Name:='a'+inttostr(i);
              Caption:='a'+inttostr(i);
          end;
          ControlList.Add(tabsheet1);
      end;//end for
    4、在FORMDESTROY事件中释放动态生成的控件资源
    procedure TForm1.FormDestroy(Sender: TObject);
    var i:Integer;
    begin
      for i := 1 to ControlList.Count -1 do
        TQRLabel(ColTitleList.Items[i]).free;
      ColTitleList.free;  for i := 1 to ColDetailList.Count -1 do
        TTabSheet(ControlList.Items[i]).free;
      ControlList.free;
    end;
    我用以上代码在动态创建控件中使用没有问题。呵呵给分吧^o^,没有功劳也有苦劳吧
      

  9.   

    根据控件名(你也可用其它)返回你要的控件,你想对它怎么操作都可以
    操作:
    Var
      bb:TButton;
    begin
      bb :=GetMyButton('Button2');
      if bb <> nil then
        bb.Free;
    end;function TForm1.GetMyButton(Const CompName:String):TButton;
    var
      I: Integer;
      Temp: TComponent;
    begin
      Result :=nil;
      for I := ComponentCount - 1 downto 0 do  //查找所有控件
      begin
        Temp := Components[I];
        if (Temp is TButton) then  //是否Button,你可用TabSheet,ListView等
        begin
          if (Temp As TButton).Name =CompName then  //控件名称比较,你可以用Caption.Tag等
          Begin
            Result :=(Temp as TButton);
            Exit;
          end;
        end;
      end;
    end;
      

  10.   

    呵呵,一定是你的笔误了procedure TForm1.FormCreate(Sender: TObject);
    begin
        tablist.Create; //!! tablist:=TObjectList.Create;
    end;
      

  11.   

    我试了,可是tobjectlist.items[i]得到的是tobject型,而不是ttabsheet?
      

  12.   

    在确知实际存储的对象实例的类时,可以用强制类型转换将最底层的(因此兼容所有类)TObject转换成更高的对象类,即TTabSheet(objList.Items[i]),这就是面向对象的多态在实际中的应用之一。
      

  13.   

    同理,TTabSheet(PageControl.FindChildControl(tabsheet's name))
      

  14.   

    可以定义一个TObject的指针数组来存放生成的控件。然后用该指针数组来对控件进行操作。
      

  15.   

    你用过FindComponent么,试一试,给你一个惊喜。