2014-02-26 115 views
2

我的場景: 我已經構建了一個具有多個輸入字段的表單。其中一個文本輸入字段具有一個底層事件偵聽器,用於捕獲「更改」事件。帶時間延遲的文本輸入

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

使用形式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中的示例表單測試了這種方法,我認爲它符合您的要求。如果你想在同一個表單上爲多個文本框做這樣的事情,這個建議不會削減它。

+0

完美答案!謝謝! – kn0x

2

我會建議你使用_AfterUpdate事件,而不是 - 而只需用戶按下完成輸入字符時回車鍵或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