在一个子窗体的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但是却无法阻止 操作执行中子窗体被关闭。请问如何解决。

解决方案 »

  1.   

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
      Cancel =1
    End Sub
      

  2.   

    Private Sub Form_Unload(Cancel As Integer)
      If Command1.Enabled = False Then Cancel=1
    End Sub
      

  3.   

    Private Sub Form_Terminate()Private Sub Form_Unload(Cancel As Integer)这两个过程中要不要加Cancel =1再请问 QUERYUNLOAD和UNLOAD有什么区别
      

  4.   

    1 引言 
      在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事件中取消窗体的卸载,以提高程序的流通性,减少用户的挫折感。 
      因此有的人在这方面的程序设计时往往感到茫然,明明是在程序设计时都已经进行了某项功能的设计,可在程序运行时确没有这一功能的体现。我相信在编程时有了上面两方面的理解就可以使好多编程者不在有上方面的困惑,从而在编程时可少走弯路。 
      

  5.   

    [code=VB
    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]
      

  6.   


    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
      

  7.   

    cancel = true
    exit sub是没用的