机房收费系统之“退出”

  在“退出”系统的时候进行了优化, 给出是否退出的判断,首先定义了一个公用函数:

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>
  机房收费系统之“退出”_第1张图片
机房收费系统之“退出”_第2张图片

  后在运行的过程中,发现用上图所示的“退出”选项进行退出,点击确定取消都会按其代表的程序运行,但是点击主界面右上角的退出,点击确定的确是退出程序,但是点击取消也是退出程序,这就让人纳闷了……既然退出选项功能正常,说明不是代码的问题,于是便改用 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       结束全部
 

你可能感兴趣的:(end,end,exit,退出,sub,sub,me,机房收费系统,Unload,跟,跟)