自动关闭数据库的计时器例程并不总是开始

时间:2018-12-11 01:29:08

标签: access-vba

我有一个例程,只要启动定时器例程,它就可以完美运行。如果没有开始,则什么也不会发生。

  1. 当我打开主表单时,将加载一个名为frm_Invisible的隐藏表单。我的主要形式是带有打开其他形式的按钮的典型主要形式。这不是总机。我曾经在frm_Invisible事件中致电On Load,但不确定是否有什么作用,但现在我将呼叫放入On Open事件中。

    frmMain这样称呼它:

    Private Sub Form_Open(Cancel As Integer)
        DoCmd.OpenForm "frm_Invisible", acNormal, , , , acHidden
    End Sub
    
  2. frm_Invisible有一个On Timer事件:

    Private Sub Form_Timer()
        Static OldControlName As String
        Static OldFormName As String
        Static ExpiredTime
    
        Dim ActiveControlName As String
        Dim ActiveFormName As String
        Dim ExpiredMinutes
        Dim CountDown
    
        On Error Resume Next
    
        ActiveControlName = Screen.ActiveControl.Name
        ActiveFormName = Screen.ActiveForm.Name
    
        Me.txtActiveForm = ActiveFormName
    
        If (OldControlName = "") Or (OldFormName = "") _
            Or (ActiveFormName <> OldFormName) _
            Or (ActiveControlName <> OldControlName) Then
    
            OldControlName = ActiveControlName
            OldFormName = ActiveFormName
    
            ExpiredTime = 0
        Else
            ExpiredTime = ExpiredTime + Me.TimerInterval
        End If
    
        'Timer interval is set to 1000 which is equal to 1 second
        'for testing, you can remove the /60 and make ExpiredMinutes happen a lot faster
        'otherwise, keep the /60 and it will truly be whatever you set at the end
    
        ExpiredMinutes = (ExpiredTime / 1000) / 60
        Me.txtIdleTime = ExpiredMinutes
        Form_frmMain.txtExpiredMinutes = ExpiredMinutes
    
        If ExpiredMinutes >= 3 Then  ' Can change this to 3 if you remove the '/60
            'Opening this form will trigger the final count down
            DoCmd.OpenForm "frmAutoClose"
        End If
    End Sub
    
  3. 如果时间用完了,我将打开一个从20开始倒数​​的第3个表单,这为用户提供了保持数据库打开的机会。

它仅从20开始倒数​​

DoCmd.quit

除非用户在倒计时完成之前单击一个按钮。该按钮仅关闭第三个表单,从而防止数据库关闭。

为了测试例程,我在frmMain上放置了一个文本框,以便可以监视计时器是否启动。

Form_frmMain.txtExpiredMinutes = ExpiredMinutes

在大多数时间,它确实可以看到时间计数。但是,在某些情况下,我无法解释为什么计时器无法启动。因此,我尚未为我的用户发布此最新更新。

1 个答案:

答案 0 :(得分:0)

我现在只能给您一些一般建议:

  1. 您应该踢出On Error Resume Next,看看是否可能发生任何错误。 稍后,您应该添加“正确的”错误处理。
  2. 向此变量添加类型:ExpiredTimeExpiredMinutes。也许Long
  3. 根本没有使用变量CountDown
  4. 为防止溢出,您可以在变量ExpiredTime中直接存储秒而不是毫秒。

然后看看会发生什么。

更新

由于在您的情况下可能会发生任何形式的活动,因此没有控件处于活动状态,因此我将创建两个过程来检索该信息。 都将返回一个空字符串,以防发生错误2474/2475。

Public Function GetActiveFormName() As String
    On Error GoTo Catch

    GetActiveFormName = Screen.ActiveForm.Name

Done:
    Exit Function

Catch:
    If Err.Number <> 2475 Then
        MsgBox Err.Number & ": " & Err.Description, vbExclamation, "GetActiveFormName()"
    End If
    Resume Done
End Function

Public Function GetActiveControlName() As String
    On Error GoTo Catch

    GetActiveControlName = Screen.ActiveControl.Name

Done:
    Exit Function

Catch:
    If Err.Number <> 2474 Then
        MsgBox Err.Number & ": " & Err.Description, vbExclamation, "GetActiveFormName()"
    End If
    Resume Done
End Function