文本输入有时间延迟

时间:2014-02-26 14:07:14

标签: vba ms-access access-vba

我的情景: 我已经构建了一个包含多个输入字段的表单。其中一个文本输入字段有一个底层事件监听器,它捕获“更改”事件。

Private Sub orderID_Change()
    If Not IsNull(Me.orderID.Text) Then
        Set Me.orders.Recordset = ordermanager.getOrder(Me.orderID.Text)
    End If
End Sub

当用户输入特定的订单号时,将为用户已在文本字段中输入的每个字母/符号运行回调。

我的问题: msaccess中是否有可能为特定输入掩码创建时间延迟?

例如:用户正在键入带有一些数字的订单号。当第一个更改事件被触发时,内部计时器功能开始递减计数器。只要现在用户发生了额外的交互,计时器就会耗尽时间并调用底层函数。 如果在此期间,用户进行了额外输入,则应重置计数器。

例如:用户输入“123”

SYSTEM     : waiting for input
USER INPUT : 1
SYSTEM     : timer 100ms
SYSTEM     : timer 80ms
SYSTEM     : timer 60ms
SYSTEM     : timer 40ms
USER INPUT : 2
SYSTEM     : timer 100ms
SYSTEM     : timer 80ms
USER INPUT : 3
SYSTEM     : timer 100ms
SYSTEM     : timer 80ms
SYSTEM     : timer 60ms
SYSTEM     : timer 40ms
SYSTEM     : timer 20ms
SYSTEM     : timer 0ms
SYSTEM     : Run Routine

2 个答案:

答案 0 :(得分:2)

我建议您使用_AfterUpdate事件 - 只需让用户在输入完字符后按Enter键或Tab键。这样它只会发射一次。如果用户暂停寻找某些东西,尝试构建计时器可能无效。

或者如果订单#总是相同的长度(即6),您可以这样做:

Private Sub orderID_Change()
    If Len(Me.orderID.Text) < 6 Then
        'Debug.Print "len=" & Len(Me.orderID.Text)
        Exit Sub
    Else
        'Debug.Print "Ready to set RS!!"
        Set Me.orders.Recordset = ordermanager.getOrder(Me.orderID.Text)
    End If
End Sub

答案 1 :(得分:2)

使用表单Timer事件。在表单加载时将TimerInterval设置为零。然后,在文本框更改事件中,将TimerInterval重置为倒计时器值。

注意Me.orderID.Text是一个文本属性,永远不会为空。因此,在orderID_Change中检查其长度是否大于零。

Private Sub Form_Load()
    Me.TimerInterval = 0
End Sub

Private Sub Form_Timer()
    MsgBox "Run routine now"
    Me.TimerInterval = 0
End Sub

Private Sub orderID_Change()
    'If Not IsNull(Me.orderID.Text) Then
    If Len(Me.orderID.Text) > 0 Then
        Me.TimerInterval = 1000 ' milliseconds
    Else
        Me.TimerInterval = 0
    End If
End Sub

我在Access 2007中使用示例表单测试了该方法,我认为它可以满足您的要求。如果您想对同一表单上的多个文本框执行此类操作,则此建议不会删除它。