当前位置: 代码迷 >> C++ Builder >> 任何窗口都急需在OnClose事件中caFree吗
  详细解决方案

任何窗口都急需在OnClose事件中caFree吗

热度:11014   发布时间:2013-02-26 00:00:00.0
任何窗口都需要在OnClose事件中caFree吗?
我完全不知道Action=caFree;是用来干什么的,我总是在窗口的析构函数中delete所有new出来的东西,但是最近从各种渠道看到用这条语句在关闭窗口时释放资源的例子,搞得我很困惑。

我说的“任何窗口”指的是依靠c++builder设计出来的窗口以及动态生成的窗口,后者如下:

TForm * form2=new TForm(this);
form2->Parent=this;


是不是都需要在响应OnClose事件的函数中写上

Action=caFree;
c++builder action caFree OnClose

------解决方案--------------------------------------------------------
应该无此必要
------解决方案--------------------------------------------------------
这是个TCloseAction枚举,有4个值
caNone
caHide
caFree
caMinimize

顾名思义,在窗体的OnClose事件中可以设置Action属性来做一些限定
比如要保证Close这个窗体前要做一个确认提示
void form1::OnClose(tobject sender)
{
  是否确认要退出?
  如果不是,那么 Action = caNone;
  Close动作被取消,窗口不会关闭
}

caFree是单文档窗口的默认值,不必显示指定
------解决方案--------------------------------------------------------
另外
TForm * form2=new TForm(this);
// AOwner指明了this,就不要再手动delete form2,AOwner(这里假设是form1)会负责管理form2的生命周期, 
// 如果手动delete form2 会发生重复delete的情况。
// TForm 是从TComponent继承下来的,TComponent维护着一个Awoner列表,
// TForm * form2=new TForm(this); 此时form2被加入了Awoner列表,当Awoner需要被清除时,
// TComponent 的析构函数中会一一销毁所有从属的TComponet。
// 只有当你不指定Awoner时才需要手动delete,TForm * form2=new TForm(NULL);delete form2;
------解决方案--------------------------------------------------------
TForm * form2=new TForm(this); // 生命周期由this管理,不用人为过问
TForm * form2=new TForm(NULL); // 效率更高,需要手动delete
//后者效率高是因为前者方式会递归调用TComponent中的虚函数Notification,(Notification负责维护前面说的那个awoner列表)。