关闭窗体问题(200)

  • 主题发起人 主题发起人 houjie2819
  • 开始时间 开始时间
H

houjie2819

Unregistered / Unconfirmed
GUEST, unregistred user!
现象:关闭主窗口时,提示“应用程序发生异常,未知的软件异常(0x0eedfade),位置为0x7c812a5b”可能原因:此程序有很多子窗体,可能是因为 --关闭主窗体时,没有关闭子窗体导致,(事实上,也是这么操作的,在所有子窗体都关闭的情况下,关闭主窗体不会有问题;在有子窗体未关闭的情况下,直接关闭了主窗体,这就会出现此问题)其中,每个子窗体都是这么生产的 Frm_N:=TFrm_N.create(nil);
Frm_N.Show;或者Frm_N:=TFrm_N.create(frm_main);
Frm_N.Show;其中每个子窗体关闭时:Destroy事件中为 Frm_N:=nil;onclose事件为 preform:=nil;action:=cafree;主窗体:onclose事件为 application.Terminate;请问:我该如何处理这个问题?
 
这么操作没有问题的。
 
主窗体:onclose事件不需要application.Terminate,虽然添加了也没事。你可以在主窗体的OnCloseQuery事件中,通过循环把各个子窗体关闭,如下:procedure TForm1.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
While Self.MDIChildCount>0do
Self.MDIChildren[0].Close;
end;
 
恩 同意楼上的 再关闭主窗体前先释放子窗体
 
application.Terminate 改为hlt;
 
znxia:按你说的做了,可好象还不行,问题依旧, 难道 还得在每个窗体生成的时候记录下其handle? 我不是很懂,请指教zkkton: 改成 halt吧? 好像也不行。
 
是不是有其他線程沒關閉?
 
不行就换到onClose中执行While Self.MDIChildCount>0do
Self.MDIChildren[0].Close;
还可以改为While Self.MDIChildCount>0do
Self.MDIChildren[0].Free;呵呵只能乱试了。
 
znxia:按你说的改了,好像错误提示没变化delives:线程,好像只有一个线程,是其它子窗体开着,而直接关闭主窗口所致 现在的问题是,直接关掉主窗体时,把其它的子窗体也快关闭了
 
也没Timer控件吧?打开一个子窗体,分别在子窗体和主窗体的onclose中加断点跟踪调试吧,快没招了,呵呵
 
主窗体OnClose中要你写Application.Terminate?脱了裤子放屁,多此一举。在你不明白代码意义的情况就别乱写,别人可以粘合代码并用控件堆出个灰鸽子,你不行。
 
子窗体 Onclose: Action:=caFree;
 
znxia:没有timer事件,对了,还有一个细节,整个过程是:运行程序后,先生成一个欢迎界面(frm_flash:=Tfrm_flash.Create(nil);
frm_flash.Show;
frm_flash.Update;
frm_flash.hide)然后再生成一个登陆界面,然后才会登陆主界面,此时如果不调出(或已关闭)其它子窗口,直接关闭主窗口,没问题;如果还有个窗口没关掉,直接关闭主窗口,就会出现问题:project 123.exe raised exception class EOSError with message 'system Error.code:1400.无效的窗口句柄。'.Process stopoed .use step to run or continue.地质灾害: 谢谢提醒 ,我会注意的bbinking:子窗口的都写了,没用
 
把无关的代码先隐含,例如欢迎界面、登陆界面。然后再看是否有异常,通过这种方法,逐步定位到到底是哪个单元导致的异常。
 
是否是多线程程序?
 
不是多线程
 
其中,每个子窗体都是这么生产的 Frm_N:=TFrm_N.create(nil);
Frm_N.Show;或者Frm_N:=TFrm_N.create(frm_main);
Frm_N.Show;其中每个子窗体关闭时:Destroy事件中为 Frm_N:=nil;onclose事件为 preform:=nil;action:=cafree;==============> 在打开模态窗口时用 Frm_N:=TFrm_N.create(nil);
退出时, 手动释放 在打开非模态窗口时用 Frm_N:=TFrm_N.create(frm_main 或 Application);
这样应该不会有问题...
 
这样也许可以,不过我现在那个程序的窗体不止100个了,有的是这样写了,有的没有,对于这个问题,还有没有其它简便的方法呢?比如有师兄说过的:用个数组记录下打开的窗体的handle,然后在关闭主窗体时检查并关闭。不过具体的操作,我也有点生疏,请大侠指点一二
 
把你工程文件的代码(begin
到end部分),主窗体的OnClose和OnCloseQuery事件,以及其中一个子窗体的OnClose和OnCloseQuery事件贴出来吧(要求该子窗体可以重现问题现象)。还有查看有没有某个单元,编写了finalization代码.正常情况下,应该不会出现这种问题的。
 
我估计你这个BUG产生的原因是由于FREE一个已经释放的窗体而产生的。一个窗体用Create(frm_main)方法创建后,frm_main就是这个子窗体的OWNER,主窗体释放的时候,会自动先调用释放子窗体的过程,此时子窗体虽然释放了,但指针却不是NIL此时如果在调用子窗体的close,free,就会出现你所说的错误。
 
后退
顶部