thisform.release
quit
可是提示:
不能退出Visual Forpro
应该怎么解决?
17 个解决方案
#1
thisform.release
quit
======>
thisform.release
close all
clea all
quit
quit
======>
thisform.release
close all
clea all
quit
#2
不行呀,因为要点击“退出”按钮,所以提示:不能清除command2,因为它正在使用中
#3
*Do While Txnlevel()>0
* Rollback
*Enddo
release thisform
clear events
quit
* Rollback
*Enddo
release thisform
clear events
quit
#4
你应该有地使用了
READ EVENTS
QUIT
吧
改为:
ThisForm.RELEASE
close data
clear events
READ EVENTS
QUIT
吧
改为:
ThisForm.RELEASE
close data
clear events
#5
请参考:
http://www.foxer.net/lun/printpage.asp?BoardID=3&ID=311
http://www.foxer.net/lun/printpage.asp?BoardID=3&ID=311
#6
改为:
ThisForm.RELEASE
close data
clear events
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
这样并没有退出整个系统,只是退出了这个窗口
ThisForm.RELEASE
close data
clear events
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
这样并没有退出整个系统,只是退出了这个窗口
#7
还是不行呀
#8
在你使用
READ EVENTS
这句之后加:
QUIT
READ EVENTS
这句之后加:
QUIT
#9
加了:
ThisForm.RELEASE
close data
clear events
quit
还是提示:不能退出Visual Foxpro
点“确定”之后,还是照样进入了系统
我就是想实现在登录的时候,如果点击“退出”,就直接退出整个系统,如果输入了用户名和密码,点“确定”,就进入系统,这样可以知道当前的操作员是谁。
现在的问题是,在登录的时候,点击“退出”,只是释放了这个登录窗口,并没有退出系统,一样可以进入系统进行操作,这样这个登录窗口就没有意义了。
该怎么办呀?急死了
怎样在登录的时候,单击“退出”按钮,就直接退出整个系统哪?
ThisForm.RELEASE
close data
clear events
quit
还是提示:不能退出Visual Foxpro
点“确定”之后,还是照样进入了系统
我就是想实现在登录的时候,如果点击“退出”,就直接退出整个系统,如果输入了用户名和密码,点“确定”,就进入系统,这样可以知道当前的操作员是谁。
现在的问题是,在登录的时候,点击“退出”,只是释放了这个登录窗口,并没有退出系统,一样可以进入系统进行操作,这样这个登录窗口就没有意义了。
该怎么办呀?急死了
怎样在登录的时候,单击“退出”按钮,就直接退出整个系统哪?
#10
我是说在
READ EVENTS
这句之后加:
QUIT
不是在
CLEAR EVENTS
之后。
READ EVENTS
这句之后加:
QUIT
不是在
CLEAR EVENTS
之后。
#11
参考一下这个:
&&主程序:
PUBLIC login_t
do form 登录表单
read events
if login_t=.t.
do form 进入系统表单
read events
quit
else
quit
endIF
&&登录表单的退出按钮:
login_t=.F.
ThisForm.RELEASE
close data
clear events
&&主程序:
PUBLIC login_t
do form 登录表单
read events
if login_t=.t.
do form 进入系统表单
read events
quit
else
quit
endIF
&&登录表单的退出按钮:
login_t=.F.
ThisForm.RELEASE
close data
clear events
#12
在主文件中加入on shutdown quit
就行了
就行了
#13
**********以下语句可以退出VFP*************
Do While Txnlevel()>0 &&如果你用事务处理,这三行是用来结束所有事务
Rollback
Enddo
close database all &&所有数据关闭
clear dlls
Declare ExitThread in Win32API &&结果本程序
ExitThread()
**** end of myquit******
Do While Txnlevel()>0 &&如果你用事务处理,这三行是用来结束所有事务
Rollback
Enddo
close database all &&所有数据关闭
clear dlls
Declare ExitThread in Win32API &&结果本程序
ExitThread()
**** end of myquit******
#14
在主文件中加入on shutdown quit
就行了
强烈同意
就行了
强烈同意
#15
一般在命令行中写入on shutdown,就行,
#16
“不能退出VisualFoxpro”的解决方法综述
供稿:RMH、梅子、mmzhy、alankung等
如何避免“不能退出 Visual FoxPro”信息
是否曾不断的试着关闭你的应用程序, 而得到的回答是不能退出?
你开发了一个应用程序并将它交会给你的用户, 一切正常。 但是突然你接到一个电话, 用户试着关闭应用程序,但所得到的信息是“"不能退出Visual FoxPro”。
为什么?因为应用程序仍然在事件循环中。
在应用程序某一地方, 你可能有类似下面的代码:
DO MainMenu.MPR
READ EVENTS
一旦在程序中发布了事件循环( READ EVENTS 命令), 在退出事件循环前,你就不能退出 VFP。 要清除事件循环,发布一条 CLEAR EVENTS 命令。只要用户想关闭应用程序时(如从系统菜单中选择了“关闭”或“退出”),你可以正常的执行一条 CLEAR EVENTS。
但是如果用户试着单击窗口标题栏中的关闭按钮时,会发生什么情况呢? 或者用户在应用程序仍然运行着的时候关闭 Windows 又会怎样? 在这些情况下, 应用程序没有机会执行 CLEAR EVENT,事件循环仍然是活动的, 因此出现了不能退出 VFP 的信息。
要避免这一点,可使用 ON SHUTDOWN 命令。 该命令的运行方式与 VFP 的其它 “On” 命令(如 ON ERROR)一样, 它指定一个当确定的事件发生时要执行的行动。 在这种情况下, 事件是以任何方式试图关闭应用程序。
因此你所要做的只是执行 ON SHUTDOWN CLEAR EVENTS。 应该在应用程序开始时—发布 READ EVENTS 之前。一旦你这样做了, 用户决不会再次见到不能退出信息。 当用户单击窗口标题样中的关闭按钮时,程序将执行 ON SHUTDOWN 代码,这将会退出事件循环并将控制返回 READ EVENTS 后面的代码。
什么也没有发生
好了,还不完全。 现在试着在 VFP 开发环境中运行一个 .APP, 关闭该 .APP, 然后试着退出 Visual FoxPro。当你用文件菜单中的退出时,没有什么问题,但在命令窗口打入 QUIT 或单击窗口标题栏的关闭按钮时,结果是相同的:什么也没有发生,没有退出 VFP,没有错误提示。
为什么?因为 ON SHUTDOWN 命令仍然在起作用,因此在关闭 VFP 时,VFP 只是简单地执行一条 CLEAR EVENTS, 这对开发环境没有作用,并且也没有程序在运行。
要避免这一点, 返回到应用程序中, 并添加另一个 ON SHUTDOWN 命令。 这一次,,仅仅是不带任何子句的 ON SHUTDOWN, 将它放入清理代码中, 就是说, 在 READ EVENTS 后面的某处。 它的作用是取消原来的 ON SHUTDOWN。
这一对命令— ON SHUTDOWN CLEAR EVENTS 和 ON SHUTDOWN —是想雅致地关闭应用程序的最小要求。 但是,根据应用程序的结构,你可能需要做更多的事。
清理
在我们自己的应用程序中, 文件菜单中的退出菜单项,在发布 CLEAR EVENTS 命令前执行某些特定的清除代码。 特别地,遍历所有已打开表单(通过 _SCREEN 的 Forms 集合Z), 关闭各个表单。 在这样做的同时,提示用户处理未保存的修改,这样做可以让用户决定是否取消关闭应用程序,以避免因清除事件循环而仍在屏幕上留下一些打开的表单。
无论用户是采用何种方法关闭应用程序,程序需要经过相同的处理过程。 要达到这一点,我们放入以上处理到一个我们叫做 FileExit 的过程中。 文件菜单的的退出菜单项简单地用 DO FileExit 调用该过程,在 ON SHUTDOWN 命令中也一样。 换句话说,现在不是 ON SHUTDOWN CLEAR EVENTS,而是 ON SHUTDOWN DO FileExit。 采用这种方法, 无论用户采用什么方法关闭程序,关闭处理总是相同的。
事务
至此,在一般情况下已经可以很好地解决“不能退出VFP”的问题。
但是,有些个别情况就不能很好的完成这一任务。
特别是加了ON ERROR .......QUIT 语句来捕捉错误然后退出的时候,在这时事务处理中修改一个数据库中的记录时,网络上的其他用户在结束事务前不能访问(不论是读还是写)这些记录。当网络上的其他用户要访问事务中修改过的记录时,必须等到事务结束之后。这时候运行 QUIT 命令仍会出现“不能退出VFP”提示。
我们可以使用 TxnLevel 函数来确定当前事务的层次(它返回 0 到 5 之间的一个值,如果进程中没有事务,返回 0),然后用 RollBack 恢复当前事务期间所做的任何修改。如果事务是嵌套的,则只恢复自前一个 BEGIN TRANSACTION 命令起所做的修改,恢复后,程序继续执行下面的语句。这样,我们再退出就可以了。
示例代码
ON SHUTDOWN DO FileExit
*PROCEDURE FileExit
DO WHILE TxnLevel() > 0
ROLLBACK
ENDDO
CLEAR EVENTS
DO WHILE _SCREEN.FormCount > 0
_SCREEN.Forms(1).Release
ENDDO
补充
在Visual FoxPro3.0中,即使read event事件處于活動狀態,也可以使用Quit直接退出。
在Visual FoxPro5.0中,如果有多個活動表單在運行的情況下,必須先關閉活動的表單。
供稿:RMH、梅子、mmzhy、alankung等
如何避免“不能退出 Visual FoxPro”信息
是否曾不断的试着关闭你的应用程序, 而得到的回答是不能退出?
你开发了一个应用程序并将它交会给你的用户, 一切正常。 但是突然你接到一个电话, 用户试着关闭应用程序,但所得到的信息是“"不能退出Visual FoxPro”。
为什么?因为应用程序仍然在事件循环中。
在应用程序某一地方, 你可能有类似下面的代码:
DO MainMenu.MPR
READ EVENTS
一旦在程序中发布了事件循环( READ EVENTS 命令), 在退出事件循环前,你就不能退出 VFP。 要清除事件循环,发布一条 CLEAR EVENTS 命令。只要用户想关闭应用程序时(如从系统菜单中选择了“关闭”或“退出”),你可以正常的执行一条 CLEAR EVENTS。
但是如果用户试着单击窗口标题栏中的关闭按钮时,会发生什么情况呢? 或者用户在应用程序仍然运行着的时候关闭 Windows 又会怎样? 在这些情况下, 应用程序没有机会执行 CLEAR EVENT,事件循环仍然是活动的, 因此出现了不能退出 VFP 的信息。
要避免这一点,可使用 ON SHUTDOWN 命令。 该命令的运行方式与 VFP 的其它 “On” 命令(如 ON ERROR)一样, 它指定一个当确定的事件发生时要执行的行动。 在这种情况下, 事件是以任何方式试图关闭应用程序。
因此你所要做的只是执行 ON SHUTDOWN CLEAR EVENTS。 应该在应用程序开始时—发布 READ EVENTS 之前。一旦你这样做了, 用户决不会再次见到不能退出信息。 当用户单击窗口标题样中的关闭按钮时,程序将执行 ON SHUTDOWN 代码,这将会退出事件循环并将控制返回 READ EVENTS 后面的代码。
什么也没有发生
好了,还不完全。 现在试着在 VFP 开发环境中运行一个 .APP, 关闭该 .APP, 然后试着退出 Visual FoxPro。当你用文件菜单中的退出时,没有什么问题,但在命令窗口打入 QUIT 或单击窗口标题栏的关闭按钮时,结果是相同的:什么也没有发生,没有退出 VFP,没有错误提示。
为什么?因为 ON SHUTDOWN 命令仍然在起作用,因此在关闭 VFP 时,VFP 只是简单地执行一条 CLEAR EVENTS, 这对开发环境没有作用,并且也没有程序在运行。
要避免这一点, 返回到应用程序中, 并添加另一个 ON SHUTDOWN 命令。 这一次,,仅仅是不带任何子句的 ON SHUTDOWN, 将它放入清理代码中, 就是说, 在 READ EVENTS 后面的某处。 它的作用是取消原来的 ON SHUTDOWN。
这一对命令— ON SHUTDOWN CLEAR EVENTS 和 ON SHUTDOWN —是想雅致地关闭应用程序的最小要求。 但是,根据应用程序的结构,你可能需要做更多的事。
清理
在我们自己的应用程序中, 文件菜单中的退出菜单项,在发布 CLEAR EVENTS 命令前执行某些特定的清除代码。 特别地,遍历所有已打开表单(通过 _SCREEN 的 Forms 集合Z), 关闭各个表单。 在这样做的同时,提示用户处理未保存的修改,这样做可以让用户决定是否取消关闭应用程序,以避免因清除事件循环而仍在屏幕上留下一些打开的表单。
无论用户是采用何种方法关闭应用程序,程序需要经过相同的处理过程。 要达到这一点,我们放入以上处理到一个我们叫做 FileExit 的过程中。 文件菜单的的退出菜单项简单地用 DO FileExit 调用该过程,在 ON SHUTDOWN 命令中也一样。 换句话说,现在不是 ON SHUTDOWN CLEAR EVENTS,而是 ON SHUTDOWN DO FileExit。 采用这种方法, 无论用户采用什么方法关闭程序,关闭处理总是相同的。
事务
至此,在一般情况下已经可以很好地解决“不能退出VFP”的问题。
但是,有些个别情况就不能很好的完成这一任务。
特别是加了ON ERROR .......QUIT 语句来捕捉错误然后退出的时候,在这时事务处理中修改一个数据库中的记录时,网络上的其他用户在结束事务前不能访问(不论是读还是写)这些记录。当网络上的其他用户要访问事务中修改过的记录时,必须等到事务结束之后。这时候运行 QUIT 命令仍会出现“不能退出VFP”提示。
我们可以使用 TxnLevel 函数来确定当前事务的层次(它返回 0 到 5 之间的一个值,如果进程中没有事务,返回 0),然后用 RollBack 恢复当前事务期间所做的任何修改。如果事务是嵌套的,则只恢复自前一个 BEGIN TRANSACTION 命令起所做的修改,恢复后,程序继续执行下面的语句。这样,我们再退出就可以了。
示例代码
ON SHUTDOWN DO FileExit
*PROCEDURE FileExit
DO WHILE TxnLevel() > 0
ROLLBACK
ENDDO
CLEAR EVENTS
DO WHILE _SCREEN.FormCount > 0
_SCREEN.Forms(1).Release
ENDDO
补充
在Visual FoxPro3.0中,即使read event事件處于活動狀態,也可以使用Quit直接退出。
在Visual FoxPro5.0中,如果有多個活動表單在運行的情況下,必須先關閉活動的表單。
#17
在你的主程序中定义一个过程就可以了啊!如:
read events
procedure onquit
clear events
close all
quit
endproc
然后在登陆界面中调用这个过程就可以退出了啊!
read events
procedure onquit
clear events
close all
quit
endproc
然后在登陆界面中调用这个过程就可以退出了啊!
#1
thisform.release
quit
======>
thisform.release
close all
clea all
quit
quit
======>
thisform.release
close all
clea all
quit
#2
不行呀,因为要点击“退出”按钮,所以提示:不能清除command2,因为它正在使用中
#3
*Do While Txnlevel()>0
* Rollback
*Enddo
release thisform
clear events
quit
* Rollback
*Enddo
release thisform
clear events
quit
#4
你应该有地使用了
READ EVENTS
QUIT
吧
改为:
ThisForm.RELEASE
close data
clear events
READ EVENTS
QUIT
吧
改为:
ThisForm.RELEASE
close data
clear events
#5
请参考:
http://www.foxer.net/lun/printpage.asp?BoardID=3&ID=311
http://www.foxer.net/lun/printpage.asp?BoardID=3&ID=311
#6
改为:
ThisForm.RELEASE
close data
clear events
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
这样并没有退出整个系统,只是退出了这个窗口
ThisForm.RELEASE
close data
clear events
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
这样并没有退出整个系统,只是退出了这个窗口
#7
还是不行呀
#8
在你使用
READ EVENTS
这句之后加:
QUIT
READ EVENTS
这句之后加:
QUIT
#9
加了:
ThisForm.RELEASE
close data
clear events
quit
还是提示:不能退出Visual Foxpro
点“确定”之后,还是照样进入了系统
我就是想实现在登录的时候,如果点击“退出”,就直接退出整个系统,如果输入了用户名和密码,点“确定”,就进入系统,这样可以知道当前的操作员是谁。
现在的问题是,在登录的时候,点击“退出”,只是释放了这个登录窗口,并没有退出系统,一样可以进入系统进行操作,这样这个登录窗口就没有意义了。
该怎么办呀?急死了
怎样在登录的时候,单击“退出”按钮,就直接退出整个系统哪?
ThisForm.RELEASE
close data
clear events
quit
还是提示:不能退出Visual Foxpro
点“确定”之后,还是照样进入了系统
我就是想实现在登录的时候,如果点击“退出”,就直接退出整个系统,如果输入了用户名和密码,点“确定”,就进入系统,这样可以知道当前的操作员是谁。
现在的问题是,在登录的时候,点击“退出”,只是释放了这个登录窗口,并没有退出系统,一样可以进入系统进行操作,这样这个登录窗口就没有意义了。
该怎么办呀?急死了
怎样在登录的时候,单击“退出”按钮,就直接退出整个系统哪?
#10
我是说在
READ EVENTS
这句之后加:
QUIT
不是在
CLEAR EVENTS
之后。
READ EVENTS
这句之后加:
QUIT
不是在
CLEAR EVENTS
之后。
#11
参考一下这个:
&&主程序:
PUBLIC login_t
do form 登录表单
read events
if login_t=.t.
do form 进入系统表单
read events
quit
else
quit
endIF
&&登录表单的退出按钮:
login_t=.F.
ThisForm.RELEASE
close data
clear events
&&主程序:
PUBLIC login_t
do form 登录表单
read events
if login_t=.t.
do form 进入系统表单
read events
quit
else
quit
endIF
&&登录表单的退出按钮:
login_t=.F.
ThisForm.RELEASE
close data
clear events
#12
在主文件中加入on shutdown quit
就行了
就行了
#13
**********以下语句可以退出VFP*************
Do While Txnlevel()>0 &&如果你用事务处理,这三行是用来结束所有事务
Rollback
Enddo
close database all &&所有数据关闭
clear dlls
Declare ExitThread in Win32API &&结果本程序
ExitThread()
**** end of myquit******
Do While Txnlevel()>0 &&如果你用事务处理,这三行是用来结束所有事务
Rollback
Enddo
close database all &&所有数据关闭
clear dlls
Declare ExitThread in Win32API &&结果本程序
ExitThread()
**** end of myquit******
#14
在主文件中加入on shutdown quit
就行了
强烈同意
就行了
强烈同意
#15
一般在命令行中写入on shutdown,就行,
#16
“不能退出VisualFoxpro”的解决方法综述
供稿:RMH、梅子、mmzhy、alankung等
如何避免“不能退出 Visual FoxPro”信息
是否曾不断的试着关闭你的应用程序, 而得到的回答是不能退出?
你开发了一个应用程序并将它交会给你的用户, 一切正常。 但是突然你接到一个电话, 用户试着关闭应用程序,但所得到的信息是“"不能退出Visual FoxPro”。
为什么?因为应用程序仍然在事件循环中。
在应用程序某一地方, 你可能有类似下面的代码:
DO MainMenu.MPR
READ EVENTS
一旦在程序中发布了事件循环( READ EVENTS 命令), 在退出事件循环前,你就不能退出 VFP。 要清除事件循环,发布一条 CLEAR EVENTS 命令。只要用户想关闭应用程序时(如从系统菜单中选择了“关闭”或“退出”),你可以正常的执行一条 CLEAR EVENTS。
但是如果用户试着单击窗口标题栏中的关闭按钮时,会发生什么情况呢? 或者用户在应用程序仍然运行着的时候关闭 Windows 又会怎样? 在这些情况下, 应用程序没有机会执行 CLEAR EVENT,事件循环仍然是活动的, 因此出现了不能退出 VFP 的信息。
要避免这一点,可使用 ON SHUTDOWN 命令。 该命令的运行方式与 VFP 的其它 “On” 命令(如 ON ERROR)一样, 它指定一个当确定的事件发生时要执行的行动。 在这种情况下, 事件是以任何方式试图关闭应用程序。
因此你所要做的只是执行 ON SHUTDOWN CLEAR EVENTS。 应该在应用程序开始时—发布 READ EVENTS 之前。一旦你这样做了, 用户决不会再次见到不能退出信息。 当用户单击窗口标题样中的关闭按钮时,程序将执行 ON SHUTDOWN 代码,这将会退出事件循环并将控制返回 READ EVENTS 后面的代码。
什么也没有发生
好了,还不完全。 现在试着在 VFP 开发环境中运行一个 .APP, 关闭该 .APP, 然后试着退出 Visual FoxPro。当你用文件菜单中的退出时,没有什么问题,但在命令窗口打入 QUIT 或单击窗口标题栏的关闭按钮时,结果是相同的:什么也没有发生,没有退出 VFP,没有错误提示。
为什么?因为 ON SHUTDOWN 命令仍然在起作用,因此在关闭 VFP 时,VFP 只是简单地执行一条 CLEAR EVENTS, 这对开发环境没有作用,并且也没有程序在运行。
要避免这一点, 返回到应用程序中, 并添加另一个 ON SHUTDOWN 命令。 这一次,,仅仅是不带任何子句的 ON SHUTDOWN, 将它放入清理代码中, 就是说, 在 READ EVENTS 后面的某处。 它的作用是取消原来的 ON SHUTDOWN。
这一对命令— ON SHUTDOWN CLEAR EVENTS 和 ON SHUTDOWN —是想雅致地关闭应用程序的最小要求。 但是,根据应用程序的结构,你可能需要做更多的事。
清理
在我们自己的应用程序中, 文件菜单中的退出菜单项,在发布 CLEAR EVENTS 命令前执行某些特定的清除代码。 特别地,遍历所有已打开表单(通过 _SCREEN 的 Forms 集合Z), 关闭各个表单。 在这样做的同时,提示用户处理未保存的修改,这样做可以让用户决定是否取消关闭应用程序,以避免因清除事件循环而仍在屏幕上留下一些打开的表单。
无论用户是采用何种方法关闭应用程序,程序需要经过相同的处理过程。 要达到这一点,我们放入以上处理到一个我们叫做 FileExit 的过程中。 文件菜单的的退出菜单项简单地用 DO FileExit 调用该过程,在 ON SHUTDOWN 命令中也一样。 换句话说,现在不是 ON SHUTDOWN CLEAR EVENTS,而是 ON SHUTDOWN DO FileExit。 采用这种方法, 无论用户采用什么方法关闭程序,关闭处理总是相同的。
事务
至此,在一般情况下已经可以很好地解决“不能退出VFP”的问题。
但是,有些个别情况就不能很好的完成这一任务。
特别是加了ON ERROR .......QUIT 语句来捕捉错误然后退出的时候,在这时事务处理中修改一个数据库中的记录时,网络上的其他用户在结束事务前不能访问(不论是读还是写)这些记录。当网络上的其他用户要访问事务中修改过的记录时,必须等到事务结束之后。这时候运行 QUIT 命令仍会出现“不能退出VFP”提示。
我们可以使用 TxnLevel 函数来确定当前事务的层次(它返回 0 到 5 之间的一个值,如果进程中没有事务,返回 0),然后用 RollBack 恢复当前事务期间所做的任何修改。如果事务是嵌套的,则只恢复自前一个 BEGIN TRANSACTION 命令起所做的修改,恢复后,程序继续执行下面的语句。这样,我们再退出就可以了。
示例代码
ON SHUTDOWN DO FileExit
*PROCEDURE FileExit
DO WHILE TxnLevel() > 0
ROLLBACK
ENDDO
CLEAR EVENTS
DO WHILE _SCREEN.FormCount > 0
_SCREEN.Forms(1).Release
ENDDO
补充
在Visual FoxPro3.0中,即使read event事件處于活動狀態,也可以使用Quit直接退出。
在Visual FoxPro5.0中,如果有多個活動表單在運行的情況下,必須先關閉活動的表單。
供稿:RMH、梅子、mmzhy、alankung等
如何避免“不能退出 Visual FoxPro”信息
是否曾不断的试着关闭你的应用程序, 而得到的回答是不能退出?
你开发了一个应用程序并将它交会给你的用户, 一切正常。 但是突然你接到一个电话, 用户试着关闭应用程序,但所得到的信息是“"不能退出Visual FoxPro”。
为什么?因为应用程序仍然在事件循环中。
在应用程序某一地方, 你可能有类似下面的代码:
DO MainMenu.MPR
READ EVENTS
一旦在程序中发布了事件循环( READ EVENTS 命令), 在退出事件循环前,你就不能退出 VFP。 要清除事件循环,发布一条 CLEAR EVENTS 命令。只要用户想关闭应用程序时(如从系统菜单中选择了“关闭”或“退出”),你可以正常的执行一条 CLEAR EVENTS。
但是如果用户试着单击窗口标题栏中的关闭按钮时,会发生什么情况呢? 或者用户在应用程序仍然运行着的时候关闭 Windows 又会怎样? 在这些情况下, 应用程序没有机会执行 CLEAR EVENT,事件循环仍然是活动的, 因此出现了不能退出 VFP 的信息。
要避免这一点,可使用 ON SHUTDOWN 命令。 该命令的运行方式与 VFP 的其它 “On” 命令(如 ON ERROR)一样, 它指定一个当确定的事件发生时要执行的行动。 在这种情况下, 事件是以任何方式试图关闭应用程序。
因此你所要做的只是执行 ON SHUTDOWN CLEAR EVENTS。 应该在应用程序开始时—发布 READ EVENTS 之前。一旦你这样做了, 用户决不会再次见到不能退出信息。 当用户单击窗口标题样中的关闭按钮时,程序将执行 ON SHUTDOWN 代码,这将会退出事件循环并将控制返回 READ EVENTS 后面的代码。
什么也没有发生
好了,还不完全。 现在试着在 VFP 开发环境中运行一个 .APP, 关闭该 .APP, 然后试着退出 Visual FoxPro。当你用文件菜单中的退出时,没有什么问题,但在命令窗口打入 QUIT 或单击窗口标题栏的关闭按钮时,结果是相同的:什么也没有发生,没有退出 VFP,没有错误提示。
为什么?因为 ON SHUTDOWN 命令仍然在起作用,因此在关闭 VFP 时,VFP 只是简单地执行一条 CLEAR EVENTS, 这对开发环境没有作用,并且也没有程序在运行。
要避免这一点, 返回到应用程序中, 并添加另一个 ON SHUTDOWN 命令。 这一次,,仅仅是不带任何子句的 ON SHUTDOWN, 将它放入清理代码中, 就是说, 在 READ EVENTS 后面的某处。 它的作用是取消原来的 ON SHUTDOWN。
这一对命令— ON SHUTDOWN CLEAR EVENTS 和 ON SHUTDOWN —是想雅致地关闭应用程序的最小要求。 但是,根据应用程序的结构,你可能需要做更多的事。
清理
在我们自己的应用程序中, 文件菜单中的退出菜单项,在发布 CLEAR EVENTS 命令前执行某些特定的清除代码。 特别地,遍历所有已打开表单(通过 _SCREEN 的 Forms 集合Z), 关闭各个表单。 在这样做的同时,提示用户处理未保存的修改,这样做可以让用户决定是否取消关闭应用程序,以避免因清除事件循环而仍在屏幕上留下一些打开的表单。
无论用户是采用何种方法关闭应用程序,程序需要经过相同的处理过程。 要达到这一点,我们放入以上处理到一个我们叫做 FileExit 的过程中。 文件菜单的的退出菜单项简单地用 DO FileExit 调用该过程,在 ON SHUTDOWN 命令中也一样。 换句话说,现在不是 ON SHUTDOWN CLEAR EVENTS,而是 ON SHUTDOWN DO FileExit。 采用这种方法, 无论用户采用什么方法关闭程序,关闭处理总是相同的。
事务
至此,在一般情况下已经可以很好地解决“不能退出VFP”的问题。
但是,有些个别情况就不能很好的完成这一任务。
特别是加了ON ERROR .......QUIT 语句来捕捉错误然后退出的时候,在这时事务处理中修改一个数据库中的记录时,网络上的其他用户在结束事务前不能访问(不论是读还是写)这些记录。当网络上的其他用户要访问事务中修改过的记录时,必须等到事务结束之后。这时候运行 QUIT 命令仍会出现“不能退出VFP”提示。
我们可以使用 TxnLevel 函数来确定当前事务的层次(它返回 0 到 5 之间的一个值,如果进程中没有事务,返回 0),然后用 RollBack 恢复当前事务期间所做的任何修改。如果事务是嵌套的,则只恢复自前一个 BEGIN TRANSACTION 命令起所做的修改,恢复后,程序继续执行下面的语句。这样,我们再退出就可以了。
示例代码
ON SHUTDOWN DO FileExit
*PROCEDURE FileExit
DO WHILE TxnLevel() > 0
ROLLBACK
ENDDO
CLEAR EVENTS
DO WHILE _SCREEN.FormCount > 0
_SCREEN.Forms(1).Release
ENDDO
补充
在Visual FoxPro3.0中,即使read event事件處于活動狀態,也可以使用Quit直接退出。
在Visual FoxPro5.0中,如果有多個活動表單在運行的情況下,必須先關閉活動的表單。
#17
在你的主程序中定义一个过程就可以了啊!如:
read events
procedure onquit
clear events
close all
quit
endproc
然后在登陆界面中调用这个过程就可以退出了啊!
read events
procedure onquit
clear events
close all
quit
endproc
然后在登陆界面中调用这个过程就可以退出了啊!