tempad
Readygo技术搜索引擎 >>游戏开发 >> 如何释放通过Show()显示的窗体?

如何释放通过Show()显示的窗体?

Readygo技术搜索引擎 网络搜索 efish 2008-1-17 1:59:54

如何释放通过Show()显示的窗体?

楼主Cuteric(What?)2002-11-22 19:53:24 在 C++ Builder / 基础类 提问

代码如下  
       
      TfrmTest*   frmTest   =   new   TfrmTest(Application);  
      frmTest->Show();  
      ...  
   
  以上代码,frmTest显示出来之后,在什么地方delete呢?  
  我试过在frmTest的OnClose事件中调用delete   this,发现可以释放,但偶尔会出异常。  
  我就想不通还有什么地方可以释放呢? 问题点数:20、回复次数:11Top

1 楼whitelion(www.ccproj.com)回复于 2002-11-22 19:59:37 得分 0

在完成显示任务后就可以释放了。  
  但是不能在frmtest的内部函数中释放.Top

2 楼invalid(空心菜(Python是个好东东,大家多用用!))回复于 2002-11-22 20:01:58 得分 5

在frmtest的OnClose中用caFree应该可以吧。Top

3 楼Cuteric(What?)回复于 2002-11-22 20:04:43 得分 0

caFree和delete   this有什么不一样?  
  哪位能告诉我为什么delete   this不行呢?Top

4 楼iris_zhu(个个)回复于 2002-11-22 20:07:54 得分 0

Close事件里加上Release();Top

5 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2002-11-22 20:09:30 得分 0

caFree关闭form,并且释放所有分配给form的内存  
  不能在form自己的内部函数中delete自己吧?Top

6 楼warton(新群:软件创业13734424)回复于 2002-11-22 20:18:16 得分 0

显示完后不就可以释放了吗??Top

7 楼jishiping(JSP 季世平)回复于 2002-11-22 20:22:37 得分 15

在事件OnClose里,不能使用delete   this;这是因为,当Form关闭时,会调用  
  事件OnClose,但是调用完OnClose之后,VCL中还会有其它的代码用到Form,  
  所以被你delete之后,再次访问Form时就成了访问非法的指针了,这就是造成  
  程序异常的原因。而在OnClose里设定Action=caFree;的话,VCL会在完全不再  
  使用Form的情况下才删除Form的,这样就不会有问题了。Top

8 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2002-11-22 20:27:59 得分 0

还是老大说得清楚!Top

9 楼jishiping(JSP 季世平)回复于 2002-11-22 20:29:23 得分 0

将源程序的相关代码贴在下面:  
   
  procedure   TCustomForm.DoClose(var   Action:   TCloseAction);  
  begin  
      if   Assigned(FOnClose)   then   FOnClose(Self,   Action);  
  end;  
   
  procedure   TCustomForm.Close;  
  var  
      CloseAction:   TCloseAction;  
  begin  
      if   fsModal   in   FFormState   then  
          ModalResult   :=   mrCancel  
      else  
          if   CloseQuery   then  
          begin  
              if   FormStyle   =   fsMDIChild   then  
                  if   biMinimize   in   BorderIcons   then  
                      CloseAction   :=   caMinimize   else  
                      CloseAction   :=   caNone  
              else  
                  CloseAction   :=   caHide;  
              DoClose(CloseAction);  
              if   CloseAction   <>   caNone   then  
                  if   Application.MainForm   =   Self   then   Application.Terminate  
                  else   if   CloseAction   =   caHide   then   Hide  
                  else   if   CloseAction   =   caMinimize   then   WindowState   :=   wsMinimized  
                  else   Release;  
          end;  
  end;  
   
  从上面的代码可以看出,OnClose是被DoClose函数调用的,而在Form的Close  
  函数里,调用DoClose之后,还有其它的代码。一旦你在OnClose里使用delete  
  this;之后,再执行其它的代码时,就造成了非法访问内存了。Top

10 楼Tern(Tern)回复于 2002-11-23 02:10:56 得分 0

给一个全局的NULL指针,new了以后先留着它,程序退出的时候看看不是NULL就deleteTop

11 楼Cuteric(What?)回复于 2002-11-25 10:09:58 得分 0

分不多,各位老大將就點。Top

责任编辑: efish 参与评论 查找更多:
相关文章
如何打印Image中的图片? 如何打印Image中的图片?
DBgrid中如何显示时间格式? DBgrid中如何显示时间格式?
如何在客户端脚本中判断treeview的当前选中结点是否… 如何在客户端脚本中判断treeview的当前选中结点是否有下级结点
一道面试题:一个左右框架(左为A,右为B),且A和B没… 一道面试题:一个左右框架(左为A,右为B),且A和B没有任何关系,在B里有一个文本框控件。请问在A里如何访问B中的控件。
谁有最新的JCreator的注册码?Pro 2.5 Build 007 11… 谁有最新的JCreator的注册码?Pro 2.5 Build 007 11月19日发布的?多谢
还是xvid的问题(高分 !帮吗解答一下,多谢!) 还是xvid的问题(高分 !帮吗解答一下,多谢!)
MsChart能不能显示出数字? MsChart能不能显示出数字?
win XP 与WIN 98/2000的网络问题 win XP 与WIN 98/2000的网络问题
如何分配sql server 2000的操作權限﹐不同的程序員看… 如何分配sql server 2000的操作權限﹐不同的程序員看不同的數據
创建应用程序时怎样把应用程序的图标改变。 创建应用程序时怎样把应用程序的图标改变。
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎