在“退出”系统的时候进行了优化, 给出是否退出的判断,首先定义了一个公用函数:
Public Sub Exit_Judge()
Dim txtSQL As String
Dim MsgText As String
Dim mrcO As ADODB.Recordset 'OnWork_Info
Dim mrcW As ADODB.Recordset 'worklog_Info
Dim A As Integer
A = MsgBox("确定退出吗?", vbOKCancel, "提示")
If A = vbOK Then
txtSQL = "select * from OnWork_Info where UserID ='" & UserName & "'"
Set mrcO = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from worklog_Info where UserID ='" & UserName & "'and status='" & True & "'"
Set mrcW = ExecuteSQL(txtSQL, MsgText)
mrcW.Fields(5) = Date
mrcW.Fields(6) = Time
mrcW.Fields(7) = Trim(mrcO.Fields(4))
mrcW.Fields(8) = "False"
mrcW.Update
mrcW.Close
mrcO.Delete
mrcO.Update
<strong> <span style="color:#ff0000;">End </span></strong>
Else
Cancel = True
End If
End Sub
期初我是按照如下方式分情况调用的:
<span style="font-size:18px;">Private Sub MDIForm_Unload(Cancel As Integer) '点击窗口右上角的叉叉退出
Call Exit_Judge
End Sub</span>
<span style="font-size:18px;">Private Sub Exit_Click() '点击退出选项退出
Call Exit_Judge
End Sub
</span>
后在运行的过程中,发现用上图所示的“退出”选项进行退出,点击确定和取消都会按其代表的程序运行,但是点击主界面右上角的退出,点击确定的确是退出程序,但是点击取消也是退出程序,这就让人纳闷了……既然退出选项功能正常,说明不是代码的问题,于是便改用 MDIForm_QueryUnload事件,用Call Exit_Judge这种方式,但是运行时还是老样子,这说明是调用的原因,故放弃了过程的调用,直接粘贴了遍代码,就没有上述问题了~
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim txtSQL As String
Dim MsgText As String
Dim mrcO As ADODB.Recordset 'OnWork_Info
Dim mrcW As ADODB.Recordset 'worklog_Info
Dim A As Integer
A = MsgBox("确定退出吗?", vbOKCancel, "提示")
If A = vbOK Then
txtSQL = "select * from OnWork_Info where UserID ='" & UserName & "'"
Set mrcO = ExecuteSQL(txtSQL, MsgText)
txtSQL = "select * from worklog_Info where UserID ='" & UserName & "'and status='" & True & "'"
Set mrcW = ExecuteSQL(txtSQL, MsgText)
mrcW.Fields(5) = Date
mrcW.Fields(6) = Time
mrcW.Fields(7) = Trim(mrcO.Fields(4))
mrcW.Fields(8) = "False" 'True和Flase用来限制重复登录的
mrcW.Update
mrcW.Close
mrcO.Delete
mrcO.Update
<strong><span style="color:#ff0000;">End</span></strong>
Else
Cancel = True
End If
End Sub
最初用红色标识“End”那个位置写的是"Unload",点击“退出”,弹出相应的提示框,点击了确定后发现,界面没退出,且又弹出了一个相同的判断框,然而在第一次弹框的时候相应的数据在表中已经进行了相应的操作,二次弹出点击确定当然会报3021错误了……
向晓东同志请教,他说也许是模块中SubMain的问题,导致了实例化,注释后发现还是老问题。
其实我的调错水平一直很低,心理上就对调错有一种恐惧,但是这次机房收费系统,让我在坎坷中学会了很多,也让我在遇到问题的时候勇于断点调试,经调试,发现在unload me后,程序又回到了MDI的unload事件处执行,两次弹框也是必然了,于是我找到了问题所在,将Unload Me改为了End——强制结束,这下就没错了。找到问题所在很值得惊喜,最令我惊喜的是为了知其然并知其所以然,去找了度娘,“娘”还真是无私啊——买一赠一:
在VB中 "End","Unload me","Exit sub" 之间的相同与不同?
End 跟 Unload me
End是强制结束整个程序,而Unload Me是卸载当前窗体,当程序中最后一个窗体被卸载后,整个程序将自动结束,如果当前窗体不是程序中的最后一个窗体,程序是不会结束的。简单的说就是end 是全部结束、 unload me针对当前窗口;相对来说,End是强制关闭,不会发生Form_Unload和Form_Terminate事件而Unload Me关闭前会发生上面2个事件。可以在上面的事件中加入退出处理代码最后加一点adodc 控件的使用说明可以增加,修改,显示 等...
End sub 跟 Exit sub
对于每个过程, End Sub 必须有且必须只有一个 ,而 Exit Sub 可以有也可以没有,可以有一个,也可以有很多个;End Sub 表示过程代码的结束, 这个必须有Exit Sub 表示退出过程,若被执行,则其下的属于该过程的代码不会被执行,通常用于中间判断例如满足某些条件时,直接退出过程而不执行其下代码、 另外呢,有一个很有趣的说法:
Exit Sub = 逃兵 或 中途跳伞
End Sub = 结束战斗
最后, 极其简单的说:
unload me 卸载自己 也就是卸载当前窗体
exit sub 结束过程
end 结束全部