"不能退出VisualFoxPro"信息
是否曾不断的试着关闭你的应用程序,而得到的回答是不能退出?在这里成为
故事.
你开发了一个应用程序并将它交会给你的用户.一切正常.但是突然你接到一个
电话.用户试着关闭应用程序,但所得到的信息是:"不能退出VisualFoxPro"(参
见图1).为什么?因为应用程序仍然在事件循环中.
图1:恐怖的不能退出信息
在应用程序某一地方,你可能有类似下面的代码:
READEVENTS
一但在程序中发布了事件循环(READEVENTS命令),在退出事件循环前,你就
不能退出VFP.要清除事件循环,发布一条CLEAREVENTS命令.只要用户想
关闭应用程序时(如,从系统菜单中选择了"关闭"或"退出:),你可以正常的执行一
条CLEAREVENTS.
但是如果用户试着单击窗口标题栏中的关闭按钮时,会发生什么情况呢?或者用
户在应用程序仍然运行着的时候关闭Windows又会怎样?在这些情况下,应用
程序没有机会执行CLEAREVENT.事件循环仍然是活动的,因此出现了不能
退出VFP的信息.
要避免这一点,可使用ONSHUTDOWN命令.该命令的运行方式与VFP的
其它"On"命令(如ONERROR)一样,它指定一个当确定的事件发生时要执行
的行动.在这种情况下,事件是以任何方式试图关闭应用程序.
因此你所要做的只是执行ONSHUTDOWNCLEAREVENTS.应该在应用程序
开始时-发布READEVENTS之前.一但你这样做了,用户决不会再次见到
不能退出信息.当用户单击窗口标题样中的关闭按钮时,程序将执行ON
SHUTDOWN代码,这将会退出事件循环并将控制返回READEVENTS后面
的代码.
什么也没有发生
好了,还不完全.现在试着在VFP开发环境中运行一个.APP.关闭该.APP.
然后试着退出VisualFoxPro.当你用文件菜单中的退出时,没有什么问题,但在
命令窗口打入QUIT或单击窗口标题栏的关闭按钮时.结果是相同的:什么也
没有发生,没有退出VFP,没有错误提示.
为什么?因为ONSHUTDOWN命令任然在起作用,因此在关闭VFP时,VFP
只是简单地执行一条CLEAREVENTS,这对开发环境没有作用并且也没有程
序在运行.
要避免这一点,返回到应用程序中,并添加另一个ONSHUTDOWN命令.这
一次,仅仅是不带任何子句的ONSHUTDOWN.将它放入清理代码中,就是说,
在READEVENTS后面的某处.它的作用是取消原来的ONSHUTDOWN.
这一对命令-ONSHUTDOWNCLEAREVENTS和ONSHUTDOWN-是想雅
致地关闭应用程序的最小要求.但是,根据应用程序的结构,你可能需要做更多
的事.
清理
在我们自己的应用程序中,文件菜单中的退出菜单项,在发布CLEAREVENTS
命令前执行某些特定的清除代码.特别地,遍历所有已打开表单(通过
_SCREEN的Forms集合),关闭各个表单.在这样做的同时,提示用户处理未
保存的修改.在样做可以让用户决定是否取消关闭应用程序,以避免因清除事件
循环而仍在屏幕上留下一些打开的表单.
无论用户是采用何种方法关闭应用程序,程序需要经过相同的处理过程.要达到
这一点,我们放入以上处理到一个我们叫做FileExit的过程中.文件菜单的的
退出菜单项简单地用DOFileExit调用该过程.在ONSHUTDOWN命令中也
一样.换句话说,现在不是ONSHUTDOWNCLEAREVENTS,而是ON
SHUTDOWNDOFileExit.采用这种方法,无论用户采用什么方法关闭程序,关
闭处理总是相同的.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
不能退出VFP和错误处理
如果你想跳过历史和推理,直接看本文的最后一节.
在我的一般错误处理例程中,我允许用户"忽略-并继续"或退出程序".这些
按钮出现在一个使用一个自由表""来显示并记录错误的表单上.在此
我主要论述我的"退出程序"按钮,因为它是最令我头痛的事之一.
使用"退出"按钮的理由可能是显而易见的,那就是允许用户退出应用程序现时
不至于因"忽略"而引发因第一个错误而产生的连锁错误.例如,因为一个错误
的变量定义值而产生的错误,显示了错误提示表单,而且用户"忽略"错误.而
接着的代码在一个SQL查询中使用该未定义的变量,这样将再次显示错误提示
表单,接着是使用先前的SQL创建的游标而造成的错误(该游标并不存在)...
等等...因此显然需要一个"退出程序"按钮.
在退出按钮的click事件中,我通常只是这样做:
CLEARALL
QUIT
但是因多种原因这不能很好的工作.最常见的是显示"不能退出VisualFoxPro".
因此我在KB中查找是否有什么处理方法,并找到:
克服"不能退出VisualFoxPro"错误
这个MS中的某人写的小程序很好地说明和处理了该问题,但是它依赖于满足
特定的条件.我想要每次都能无条件退出程序.因此我用WinAPI来找出一个
实用的方案.
我的新的事件:
*
*
*概述:直接干掉/退出EXE,不管环境情况
*
CloData
ClearDLLs
DeclareExitThreadinWin32API
ExitThread()
这样它看起来每一次都能正确地工作,几乎没有讨厌的付作用.
编码!
JimHapenney
本文发布于:2022-11-16 03:38:30,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/28593.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |