質問
私のシナリオ: 複数の入力フィールドを持つフォームを構築しました。テキスト入力フィールドの1つには、「変更」イベントがキャッチされる基盤となるイベントリスナがあります。
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
. 解決
フォームTimer
イベントを使用します。フォームロード時にTimerInterval
をゼロに設定します。次に、テキストボックスの変更イベントで、TimerInterval
をカウントダウンタイマ値にリセットします。
注Me.orderID.Text
はテキストプロパティであり、nullにはなりません。したがって、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にサンプルフォームでアプローチをテストし、それはあなたが要求したものをすると思います。あなたが同じ形式で複数のテキストボックスのためにこのような何かをしたいのなら、この提案はそれを切らないでしょう。
他のヒント
代わりに_AfterUpdateイベントを使用することをお勧めします。そのようにそれは一度発射するだけです。タイマーを構築しようとすると、ユーザーが何かを探すのに一時停止した場合も機能しない可能性があります。
または注文#が常に同じ長さ(すなわち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
.