一个关于系统退出的问题(application.Terminate)(50)

  • 主题发起人 主题发起人 ilook
  • 开始时间 开始时间
I

ilook

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的。我的程序有几个窗体(我这所有的几个窗体都没有动态创建,都是默认的自动创建)。其中,frm_login:登录--登录成功后,就写了个代码:[red] frm_main.Show; frm_login.Hide;[/red]frm_main:运行时的窗体当我点击frm_main窗体上的X时,写了个代码:[red]procedure Tfrm_main.FormClose(Sender: TObject; var Action: TCloseAction);beginif MessageBox(handle,'确定退出系统?','程序提示',MB_YESNO)=IDNO then exit; application.Terminate;end;[/red]可是如果这个时候点“否”,frm_main的窗体就消失不见啦,可是在windows的任务管理器中,[purple]这个程序还在运行![/purple][:(!]看来这样的退出机制好像有问题啊?请指点一二。另外我在网上看了。人家说要用FormCloseQuery的事件。用CanClose这样的参数来控制。我不太清楚CanClose和application.Terminate的区别。希望有朋友在帮我解决上上面问题的同时,顺便说一下CanClose和application.Terminate的区别。对了,有时候偶尔退出时,会出现下面可怕的错误:[red]Access violation at address 00502BBE in module 'jdgl.exe'. Read of address 0962FFE4[/red]谢谢,祝你幸福![:)]
 
procedure Tfrm_main.FormClose(Sender: TObject; var Action: TCloseAction);begin if Application.messagebox('您确定退出系统吗?', '提示', MB_OKCANCEL) = IDOK then Action := cafree else Action := canone;end;
 
感谢pbluec。你的那个代码和我在网上找的(没有测试)有何区别吗?if MessageBox(Handle, '确认要退出本系统吗?', '系统提示', MB_YESNO or MB_ICONQUESTION orMB_DEFBUTTON2) = IDYES then CanClose := trueelseCanClose := false;end;我对这个退出机制有点晕了,好像方法很多,但我现在的就有问题。
 
你这个是要在CanClose事件中执行的,直接对CanClose参数赋值即可,但要注意,某些情况下不会调用CanClose事件的。在Close中也可以对Action赋值实现相同效果,参见楼上的代码。
 
你去掉其它代码,我估计你还有一些东西没有Free掉。我的软件网站:http://www.0731rj.com http://www.nxbw.net 欢迎光临
 
你的问题是FormClose和FormCloseQuery这两个事件的触发时机的区别首先FormCloseQuery是程序还没有被关闭前触发,FormClose是已经被关闭才触发,所以你的窗口才消失了,也就是被关闭了至于为什么程序还在任务管理器中,主要还是楼上所说有些东西还没有free掉,例如网络连接没有中断等等
 
可能frm_main不是程序的主窗体,你查看一下创建的顺序
 
后退
顶部