在一个子窗体的COMMAND1点击后执行了一个很耗时的操作,而此窗体上还要实时的显示相关的信息,所以加了DOEVENT,这导致command1_click()操作还未完成,此子窗体却有可能被关闭。在command1_click()操作执行期间,我设置了COMMAND1.ENABELED=FALSE.而后Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Command1.Enabled = False Then Exit Sub
End SubPrivate Sub Form_Terminate()
If Command1.Enabled = False Then Exit Sub
End SubPrivate Sub Form_Unload(Cancel As Integer)
If Command1.Enabled = False Then Exit Sub
End Sub但是却无法阻止 操作执行中子窗体被关闭。请问如何解决。
If Command1.Enabled = False Then Exit Sub
End SubPrivate Sub Form_Terminate()
If Command1.Enabled = False Then Exit Sub
End SubPrivate Sub Form_Unload(Cancel As Integer)
If Command1.Enabled = False Then Exit Sub
End Sub但是却无法阻止 操作执行中子窗体被关闭。请问如何解决。
解决方案 »
- 麻烦哪位朋友发个DIB控制类我,谢谢了。。。。。。。。。。。。。。。。。急需
- word文档中的控件,不能创建,不能退出设计模式,是什么原因呀!
- 60分请教webbrowser1控件问题啊,他欺负人啊!555555555555555
- 圣诞快乐!~~~~~~`散分~~~~!
- 想学vb 看5.0的书行吗
- c/s处理问题,高手请~~~~~~~~~~~~~~
- 请问html help做.chm文件,做上下文关联怎么做,原理是什么?请给出代码,具体!
- 非常简单的api函数问题~~~
- 关于data binding的问题
- 笔记本装了office2000后经常更换域,结果使用VB6时总出现office的安装配置的窗口,有什么方法不让它出来啊,还是安装office时候可以设定?
- wscript.shell的run方法总提示文件找不到?
- vb createfile
Cancel =1
End Sub
If Command1.Enabled = False Then Cancel=1
End Sub
在VB的程序设计中,尤其是在多窗体的程序设计中经常涉及到窗体的装载和卸载问题,关于窗体的装载问题大部分VB教程中均有介绍,特别是对程序载入和窗体显示时的多个事件(Activate、Gotfocus、Initialize和load)的使用及原理有的书籍介绍的还较为详细。但对窗体的卸载问题好多书上只是轻描淡写的说了一句:“unload语句可以把窗体从内存中卸载”。在实际的编程时关于窗体的卸载仅仅知道这些显然是远远不够的。
事实上,正如程序载入和窗体显示时多个事件(Activate、Gotfocus、Initialize和load)发生一样,当卸载窗体时也会有多个事件发生。用处最多的两个事件是Queryunload和Unload,之所以不断使用到这些事件,这是因为它们都能接受Cancel参数。关于这两个事件从字面上并不难理解,但在使用上就并非向想象中那样简单。本文从如下两个方面对这两个事件进行介绍。
2 事件Queryunload和Unload参数的意义
下面是Queryunload和Unload两个事件的开头部分
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Private Sub Form_Unload(Cancel As Integer)
在这几个事件过程中都有参数Cancel,这个参数的作用到底是什么呢?Cancel是一个整形变量,给参数Cancel赋以除“0”以外的任何一个值都将阻止载入窗体的Queryunload和Unload事件,并将阻止所对应窗体和应用程序的关闭,但其所对应的卸载Queryunload事件过程仍被执行。
在前两个事件过程中都有参数UnloadMode,它在相应的事件中又起到什么作用呢?我们知道关闭一个应用程序或窗口的方法可以有多种,该参数就是用来确定你是用哪一种方法来关闭应用程序或窗口的,即用来返回关闭模式,其值及意义见表1。
表1 UnloadMode参数的返回值
3 事件Queryunload和Unload的使用
因此,利用Cancel的非0值就可以控制一个应用程序被关闭前,可使用事件Queryunload来确保在应用程序的MDI Child窗体内没有未完成的任务。例如,事件Queryunload可以检验用户是否保存了输入窗体的新数据。如果未保存,则Queryunload事件会提醒用户保存、忽略数据或取消卸载。
在多文档窗体程序设计时,当关闭对象MDIParent时,对父窗体而言事件Queryunload首先会发生,然后就是当前打开的MDI子窗体。如果没有任何窗体取消Queryunload事件,那么事件Unload就以相反的顺序发生,Visual Basic卸载每个MDI Child窗体,最后卸载MDIParent窗体。
这里也可通过事件Unload来控制一个窗口的关闭。但必须强调的是,Queryunload事件在Unload事件前发生,如果在事件Queryunload中阻止窗口的关闭(即将Cancel设为非0值),则窗体的Unload事件不会发生。所以试图关闭一个窗口,末必一定引发Unload事件。基于这一点,通常程序都应积极尝试在Queryunload事件中取消窗体的卸载,以提高程序的流通性,减少用户的挫折感。
因此有的人在这方面的程序设计时往往感到茫然,明明是在程序设计时都已经进行了某项功能的设计,可在程序运行时确没有这一功能的体现。我相信在编程时有了上面两方面的理解就可以使好多编程者不在有上方面的困惑,从而在编程时可少走弯路。
Option Explicit
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) As Long
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MessageBox(Me.hwnd, "是否退出本窗体?", "系统提示", vbYesNo + vbQuestion) = vbNo Then
Cancel = 1
End If
End Sub][/code]
Option Explicit
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) As Long
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MessageBox(Me.hwnd, "是否退出本窗体?", "系统提示", vbYesNo + vbQuestion) = vbNo Then
Cancel = 1
End If
End Sub
exit sub是没用的