我做了个MDI应用程序,假如里面有n个子窗体,
当我在MDI form上点击关闭按纽时候 ,触发OnClose事件,我在OnClose响应里写上一些释放全局单元里的全局类对象,但是我的MDI Child切换时候有一个子窗体A在它的OnActivate响应里会引用到全局单元里的全局类对象,这样导致关闭时候在某些情况下程序会抛出exception class EAccessViolation with message ' Access violation at address XX地址 异常 ...'我现在想求教两个问题:
1.就是关闭程序时候,我的主窗体的OnClose响应和子窗体的释放顺序(经过测试发现主窗体的OnClose响应处理之后才会出现子窗体的释放..(最好能帮我理顺下点击关闭时候的时候父窗体和子窗体(假定在程序中已经创建了多个子窗体)会有哪些操作,及产生事件的顺序(如:OnClose)
2.主窗体的OnClose响应为什么不需要里面加上Inherited代码,只需要将需要手动释放的的空间释放就行..,这里面是不是有个隐含代码的自动调用父类的关闭
当我在MDI form上点击关闭按纽时候 ,触发OnClose事件,我在OnClose响应里写上一些释放全局单元里的全局类对象,但是我的MDI Child切换时候有一个子窗体A在它的OnActivate响应里会引用到全局单元里的全局类对象,这样导致关闭时候在某些情况下程序会抛出exception class EAccessViolation with message ' Access violation at address XX地址 异常 ...'我现在想求教两个问题:
1.就是关闭程序时候,我的主窗体的OnClose响应和子窗体的释放顺序(经过测试发现主窗体的OnClose响应处理之后才会出现子窗体的释放..(最好能帮我理顺下点击关闭时候的时候父窗体和子窗体(假定在程序中已经创建了多个子窗体)会有哪些操作,及产生事件的顺序(如:OnClose)
2.主窗体的OnClose响应为什么不需要里面加上Inherited代码,只需要将需要手动释放的的空间释放就行..,这里面是不是有个隐含代码的自动调用父类的关闭
解决方案 »
- D6安装后找不到ado组件,请问是不是我安装有误,具体该怎么安装呢?
- 就百合的要求,看HT的悲惨,散分....
- 关于密码修改的问题。快速解决快速给分。呵呵
- 如何在连接一个Excel文件后去除多余的空行
- 天太热了,请大家来喝点可乐,呵呵
- vc调用delphi编写的dll???
- 天下难题!!!!!我只有10大洋了!!!!
- 大家快来帮帮忙.....
- 求达人帮忙改写代码
- Delphi程序员请到http://www.csdn.net/expert/topic/146/146365.shtm看看,我要散100分了.
- cxGrid同时显示两个表的问题
- char控件画图 我的数据都是正数 放大看某个数时 下面的负数表格怎么样让它不显示呢?目的就是让它从0开始!
1.OnClose事件的帮助看一下,里面不应该牵涉释放的东西的?全局对象的释放应该写在主窗口的OnFree事件里面。
2.主窗口的Class是从什么类继承下来的,如果你的主窗口不是自己手工继承的,那么就会默认去调用VCL的事件,就不需要Inherited。你先看看Inherited这行代码是代表什么吧
已经释放,原因就是我把MyClass的释放代码放在了主窗体的OnCLose。
-----------------请教各位高手如何既保证全局对象的释放,又能使得程序不暴错误。
try
FT.Free;
except
end;
我还真没用过OnFree事件,有吗,
我现在的解决方法是将A的在OnActivate里引用到的全局对象换成其他的,不在OnActivate用全局对象了
form1.Action=cafree;
form1.Action=cafree;
作为窗口来说,其实也是一个对象,有自己的CREATE,也有作为对象的FREE(可能在DELPHI里面不是ONFREE事件,而是叫OnDestroy,很久没有用DELPHI了)。在类(窗口)的OnCreate事件里面,一般会负责创建这个类(窗口)需要的变量,放到你的MDI来说,就是你的主窗口里面创建的全局变量。而窗口的OnClose只是作为窗口关闭时触发的事件,而窗口作为对象来说,这个时候他的实例没有释放,所以在OnClose事件里面就释放变量就会存在一定的问题,比如说,你的窗口不是主窗口,你释放了变量,下次你不调用CREATE而直接Show的时候,你的那些变量已经释放了,就会出错。
至于关闭主窗口的时候和子窗口的事件的调用关系,你可以看看MDIForm类关于Close事件的代码。但OnClose事件先于子窗口的OnActivate是很有可能的,
在MDI关闭的时候,你得做个循环.
var
i:integer;
begin
for i:=Application->MDIFORM->ChildFormCount-1 downto 0
begin
Application->MDIFORM->ChildForm[i]:=Close();
// delete Application->MDIFORM->ChildForm[i];
// Application->MDIFORM->ChildForm[i]:=NULL;
end end
=====================
把他们都释放掉.