我 有个Form 
是创建在  Panel 上,
现在我要释放掉,应该怎么释放啊。

解决方案 »

  1.   

    如果 form := tform.create(self) 不需要手动释放
         form := tform.create(nil); 在需要释放的地方释放 form.free;
      

  2.   

    我自己是这样释放的
      for i := 0 to pnlreceptacle.ComponentCount - 1 do
      begin
        pnlreceptacle.Components[i].Free;
      end;
    好像不对
      

  3.   

    1.for i := pnlreceptacle.ComponentCount - 1 downto 0 do
      begin
       pnlreceptacle.Components[i].Free;
      end;
    2 组件创建时 要 XXX := TXXX.Create(pnlreceptacle);3 这种方式创建的组件一般不需要释放.
    4 非要释放建议做下强类型转化
      

  4.   

    释放自己的,不确定的话建立的时候使用xxxx.create(self)
    具体要看你如何造的,才能决定你如何释放
      

  5.   

    搞懂DELPHI的OWNER机制,就知道什么时候要手动FREE什么时候不用了其实CREATE(SELF)也可以手动FREE
      

  6.   

    3楼正解!
    我对楼主的问题理解
    Form是创建在Panel上的,Form嵌套在Panel里显示,Form.Parent:=Panel,但Owner却有多种可能
    1、Form.Owner:=nil
    2: Form.Owner:=Panel
    3: Form.Owner:=Form(最底层的Form窗体,用Create(Self)创建
    还有Form.Owner:=Application或Form.Owner:=OtherCompenent等N种可能,要看你创建Form时的Owner参数是什么组件、
    只有第二种情况可以正确释放,前提是用三楼的方法。
    对所有情况有用的方法是使用Controls属性
    while pnlreceptacle.ControlCount>0 do
    pnlreceptacle.Controls[0].free; 
      

  7.   

    一般我们都使用Components属性,而不是Controls
    如果对Owner,Parent,Self很了解,还有Sender,想写什么代码都不难。
    我都这么处理这种嵌套窗体的问题,是用框架窗体TFrame类
    TFrmBase作为自定义要嵌套子窗体的基类。其Ower和Parent属性指向同一个控件。
    TFrmBase=Class(TFrame)
    ....
    public
      constructor Create(AParent: TWinControl); overload;
    ....
      constructor TFrmBase.Create(AParent: TWinControl);
      begin
        Inherited Create(AParent);
        Parent:=AParent;
        .... 
      end;