我有一个例程,只要启动定时器例程,它就可以完美运行。如果没有开始,则什么也不会发生。
当我打开主表单时,将加载一个名为frm_Invisible
的隐藏表单。我的主要形式是带有打开其他形式的按钮的典型主要形式。这不是总机。我曾经在frm_Invisible
事件中致电On Load
,但不确定是否有什么作用,但现在我将呼叫放入On Open
事件中。
frmMain
这样称呼它:
Private Sub Form_Open(Cancel As Integer)
DoCmd.OpenForm "frm_Invisible", acNormal, , , , acHidden
End Sub
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
如果时间用完了,我将打开一个从20开始倒数的第3个表单,这为用户提供了保持数据库打开的机会。
它仅从20开始倒数
DoCmd.quit
除非用户在倒计时完成之前单击一个按钮。该按钮仅关闭第三个表单,从而防止数据库关闭。
为了测试例程,我在frmMain
上放置了一个文本框,以便可以监视计时器是否启动。
Form_frmMain.txtExpiredMinutes = ExpiredMinutes
在大多数时间,它确实可以看到时间计数。但是,在某些情况下,我无法解释为什么计时器无法启动。因此,我尚未为我的用户发布此最新更新。
答案 0 :(得分:0)
我现在只能给您一些一般建议:
On Error Resume Next
,看看是否可能发生任何错误。
稍后,您应该添加“正确的”错误处理。ExpiredTime
和ExpiredMinutes
。也许Long
?CountDown
。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