有两个窗口from1,form2,from1作为主窗口,form2在创建的时候create的参数是nil,我把form2的parent的设为form1,
form1用showmadel的方式显示,但是我发现当我用form1。free的时候他会去释放form2,form2的拥有者不是他自己吗,
from1为什么会去释放??

解决方案 »

  1.   

      情况1:直接从TComponent继承下来的组件,将由它的AOwner释放(如果你不自己释放,下来的情况也一样)   
      情况2:   如果控件是从TControl继承下来的,你设定了他的Parent,当这个Parent释放时,它会释放掉所有的子控件。   
      情况3:当最后AOwner释放它的Components时,从最后一个组件开始删除,这里这个组件也会删除它内部的Comonents,如果组件是TWinControl,则它会释放掉它所有的子控件。所以说,Aowner只是负责释放所有的不可视组件,和一部分的可视控件,大部分可视控件还是由Parent来释放的。 以上仅供参考
      

  2.   

    负责释放的form2的Owner,而不是parent吧
      

  3.   

    1、參考Tcontrol中的setparent,其中有一行AParent.InsertControl(Self);
      若你的容器中的控件是wincontrol,則會被加到FWincontrols列表中,若是control類型,則被加到Fcontrols列表中。
    2、參考Twincontrol的銷毀方法,其中
      I := ControlCount;
      while I <> 0 do
      begin
        Instance := Controls[I - 1];
        Remove(Instance);
        Instance.Destroy;
        I := ControlCount;//為controls.count+wincontrols.count
      end;
      

  4.   

    然而Remove(Instance);并不釋放對象,只是將list中的所記錄的指針刪除而已!所以,問題不在因為設定了parent,而在你確定form2被釋放了嗎?請跟蹤form2的釋放代碼
      

  5.   

    另外,“form2在创建的时候create的参数是nil”---表示其生存周期由你(用戶)控制,而不是 它本身為自己的擁有者
      

  6.   

    Instance.Destroy; 
    这个应该是释放吧,
    form2已经释放了,因为我在form1.free后又调用了form2.free,报错,我看了下form2的属性都是nil。
      

  7.   

    http://topic.csdn.net/t/20050512/11/4000878.html
    楼主可以参考一下上面的连接,里面分析的比较透彻
      

  8.   

    都把form2的parent的设为form1。就好比一个手提包里装着钱包!~~手提包丢了 钱包就甭提了!~
      

  9.   

    但是,當你設定 parent後,這個就失去意義了