机房收费系统—解决子窗体最小化时,程序一关闭VB就崩溃问题

前言

  不知道大家有没有出现过这样的问题,当子窗体是最小化状态时,点击主窗体右上角的[×]按钮,或者直接关闭该子窗体时,VB就会停止运行。曾经这个问题一度困扰了我,但是原系统这样操作确确实实是没有问题的。

解决方法

  在解决这个问题之前,先来一些准备工作。
  不知道大家是否知道,一个窗体在卸载时发生的事件的顺序,其实是这样的:Form_QueryUnload() -> Form_Unload() -> Form_Terminate()。
  想必大家对Form_Unload事件已经很熟悉了,它发生在窗体卸载时。而Form_QueryUnload()发生在窗体卸载前,那么Form_Terminate()则发生在窗体卸载之后。

Form_QueryUnload()的具体用法

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

 Cancel:一个整数,将此参数设定为除 0 以外的任何值,可停止 QueryUnload 事件,并阻止该窗体和应用程序的关闭。如果取值为0,则该窗体将被关闭。
 UnloadMode:返回一个整数或一个常数,该参数取值可以指明触发QueryUnload事件的原因。
 UnloadMode取值含义如下所示:

常数 描述
vbFormControlMenu 0 单击标题栏控制菜单中的[关闭]命令,或双击该标题栏控制菜单图标或单击标题栏右边的[×]按钮
VbFormCode 1 在代码中调用Unload(卸载)语句
VbAppWindows 2 当前的Microsoft Windows操作环境会话完毕
VbAppTaskManager 3 Microsoft Windows任务管理器正在关闭应用程序
VbFormMDIForm 4 MDI(多文档界面)子窗体随着MDI窗体正在关闭
VbFormOwner 5 窗体随着其所有者的关闭而关闭

代码

  因为我发现如果子窗体是正常状态的话,直接关闭主窗体,或者直接关闭该子窗体,VB是不会停止运行的。所以,我就想到了在卸载父窗体之前先让子窗体最大化,然后再卸载掉子窗体。
  具体请看下面的代码:

Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim f As Form
    For Each f In Forms
        '如果该窗体是最小化状态
        If f.Name <> FrmMain.Name And f.WindowState = 1 Then
            '让窗体最大化或正常
            f.WindowState = 2
            Unload f
        End If
    Next
End Sub

  这样就解决了在子窗体是最小化状态时,关闭父窗体时VB会停止运行的问题。同上,在各个子窗体的Form_QueryUnload事件中,如果子窗体是最小化状态,那就先让子窗体最大化。

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If Me.WindowState = 1 Then
        Me.WindowState = 2
    End If
End Sub

Form_Unload()事件中怎么中断该过程

  一般我们在一个过程中,如果想提前退出这个过程的话,只要在你想要停止的地方写一个 Exit Sub 就可以了,可是当我把它写进Form_unload事件中时,却发挥不了作用了。
  Exit Sub的作用是结束当前的过程,它后面的代码将不会再执行。因为本来就是窗体卸载过程,如果用Exit Sub结束此过程,那么窗体还是会被卸载。
  那么怎么才能取消窗体的卸载过程呢?

Private Sub Form_Unload(Cancel As Integer)

  当把其中的Cancel参数设置成0以外的数字或者让Cancel等于True时,那么就可以取消窗体卸载。

Private Sub Form_Unload(Cancel As Integer)
    a = MsgBox("您是否确定退出?", vbOKCancel + vbExclamation + 0, "退出")
        '如果点击“确定”按钮,则Cancel=1
        If a = 1 Then
            Cancel = 1
        '否则,Cancel = 0
        else
            Cancel = 0
        End If
Sub

  当初,我不知道要这样做,就是没有熟悉窗体的卸载过程以及它的用法,没有明白过程中的参数是怎么回事。当我们不知道一个过程怎么使用的时候,可以先百度一下过程之中参数的用法,或许就会明白了。

Form_Terminate()

  关于这个事件的具体用法,小编就不知道了。我只是知道它发生在Form_Unload事件之后,而且不可以中断卸载。如果大家知道怎么使用的话,还请不吝赐教。

相关文章
相关标签/搜索