在“退出”系统的时候进行了优化, 给出是否退出的判断,首先定义了一个公用函数:
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针对当前窗口;