前言
不知道大家有没有出现过这样的问题,当子窗体是最小化状态时,点击主窗体右上角的[×]按钮,或者直接关闭该子窗体时,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事件之后,而且不可以中断卸载。如果大家知道怎么使用的话,还请不吝赐教。