我这样创建了两种控件:procedure BtnAddNewPageClick(Sender:TObject);//增加页,同时增加数据栏
begin
  with TTabSheet.Create(self) do
  begin
    PageControl:=PageControl1;
    Caption := 'TabSheet' + IntToStr(PageControl1.PageCount);
  end;
  PageIndex := PageControl1.PageCount - 1;
  with TDBGrid.Create(self) do
  begin
    Parent:=PageControl1.ActivePage;
    Align:=alClient;
    //....数据赋值省略
  end;
end;//释放
procedure BtnDestroyClick(Sender:TObject);
var
  i:integer;
begin
  for i:=0 to PageControl1.PageCount-1 do
  begin
    PageControl1.ActivePage.Free;
    //...在这里如何释放该页的TDBGrid???
  end;
end;

解决方案 »

  1.   

    不用自己释放,你创建时指定了Owner,所以调用PageControl1.ActivePage.Free;时会把dbgrid也Free掉的。
      

  2.   

    to sysu(死树) :  如果是这样的话,PageControl1.ActivePage.Free是不是也不需要?因为所在的窗体form关闭后要释放。我想会不会造成内存泄漏?
      

  3.   

    看错了,你TDBGrid的Owner是Self,把上面代码改一改吧:
    procedure BtnAddNewPageClick(Sender:TObject);//增加页,同时增加数据栏
    var sheet: TTabSheet;
    begin
      sheet := TTabSheet.Create(self);
      with sheet do
      begin
        PageControl:=PageControl1;
        Caption := 'TabSheet' + IntToStr(PageControl1.PageCount);
      end;
      PageIndex := PageControl1.PageCount - 1;
      with TDBGrid.Create(sheet) do  // Owner为sheet
      begin
        Parent:=PageControl1.ActivePage;
        Align:=alClient;
        //....数据赋值省略
      end;
    end;//释放
    procedure BtnDestroyClick(Sender:TObject);
    var
      i:integer;
    begin
      for i:=0 to PageControl1.PageCount-1 do
      begin
        PageControl1.ActivePage.Free;  // 同时释放DBGrid
      end;
    end;
      

  4.   

    to renzhm(戴尔飞):
      我想应该不会造成内存泄漏,我的理解是Form关闭时会检查是否已经释放。
      

  5.   

    谢谢sysu(死树),我刚才找到了一个获取某页上DBGrid的指针的方法:TDBGrid(PageControl1.ActivePage.Components[0]).free;每一页都只有一个TDBGrid,我获取它还为了加右键PopupMenu控制