procedure TForm_MainForm.ToolButton6Click(Sender: TObject);
var TabSheet: TTabSheet;
    WebBrowser: TWebBrowser;
begin
        TabSheet:=TTabSheet.Create(Self);
        TabSheet.Caption:='New';
        TabSheet.PageControl:=PageControl1;        WebBrowser:=TWebBrowser.Create(Self);
        TabSheet.InsertControl(WebBrowser);
        //WebBrowser.Parent:=TabSheet;
        WebBrowser.Align:=alClient;
        WebBrowser.Navigate('http://www.csdn.net');
end;上面的过程,运行时正常,我的程序在退出时,是否需要Free我动态建立的控件?

解决方案 »

  1.   

    一下是我建立的清理代码,请问各位是否有问题?
    procedure TForm_MainForm.FormClose(Sender: TObject;
      var Action: TCloseAction);
    var i: Integer;
        TabSheet: TTabSheet;
        WebBrowser: TWebBrowser;
    begin
            for i:= 0 to PageControl1.PageCount -1 do
            begin
                    TabSheet:=PageControl1.Pages[i];
                    WebBrowser:=TabSheet.Controls[0] as TWebBrowser;                TabSheet.RemoveControl(TabSheet.Controls[0]);
                    TabSheet.PageControl:=nil;                WebBrowser.Free;
                    TabSheet.Free;
            end
    end;
      

  2.   

    建议不要这样去FREE。
    要养成每CREATE一个类,在用完后就FREE它
    这样比较清晰些,而且效率会好一些!
      

  3.   

    不用了,控件会由它的Owner释放的。
      

  4.   

    同意 netatomy(Eyes On Me)  说的
      

  5.   

    to pressman(还穿三角裤):
       你的意见还是可以接受的,但是,我动态建立的是窗口型控件,只有在用户关闭,或者程序退出时才需要释放.如果,我要建立一个类的临时的实列,我当然会采用用完就释放的方法.
    to netatomy(Eyes On Me):
       我怎样才能验证你的说法?
      

  6.   

    现在比较有趣了!我两种相左的意见都得到了大家的支持!
    请同意 netatomy(Eyes On Me) 的高手给个验证的方法!
    谢谢!
    如果netatomy(Eyes On Me)正确我再开贴加100分!
      

  7.   

    我上面的释放代码有问题,更改如下,各位自己看!
    procedure TForm_MainForm.FormClose(Sender: TObject;
      var Action: TCloseAction);
    var TabSheet: TTabSheet;
        WebBrowser: TWebBrowser;
    begin
            While PageControl1.PageCount <> 0 do
            begin
                    TabSheet:=PageControl1.Pages[0];
                    WebBrowser:=TabSheet.Controls[0] as TWebBrowser;                TabSheet.RemoveControl(TabSheet.Controls[0]);
                    TabSheet.PageControl:=nil;                WebBrowser.Free;
                    TabSheet.Free;
            end
    end;
      

  8.   

    验证方法如下:
        建立两个窗口和一个共巷单元。
        在共享单元中声明一个窗口类控件,我声明了一个TEdit;
        然后让第一个窗口来创建第二个窗口,第二个窗口为模式窗口,
        在第二个窗口的Create事件中创建TEdit,然后由第一个窗口释放
        第二个窗口,不写释放TEdit代码,释放完第二个窗口后,在第一个窗口中
        ShowMessage(Edit.text)
        出现地址冲突,表明TEdit已经被第二个窗口释放,不用写释放语句。
      

  9.   

    这是一个很明显的,Owner都free掉了,它里面包含的自然都会Free,而且这些工作是由DELPHI完成的
    楼主的名字太日本化了吧
      

  10.   

    这个问题很长时间了,现在我已经有了确认的方法了.
    结论是,退出时不需要释放,但是,没有Parent的类需要自己释放.
    验证方法是:
    首先建立一个PageControl1,然后建立TabSheet,在建立的TabSheet上加入一个控件Acontrol.
    在PageControl1的onchange事件中加入:
            Acontrol.parent:=PageControl1.activePage;
    然后在加入一个按钮button1:
            TabSheet:=TTabSheet.Create(Self);
            TabSheet.Caption:='New';
            TabSheet.PageControl:=PageControl1;
    再加入一个按钮button1:
            PageControl1.activePage.free;
    程序运行时,你新建几页,在free掉当前页后,当你再进入新的页的时候你就会发现:Acontrol is nil