Ввод текста с задержкой по времени
-
21-12-2019 - |
Вопрос
Мой сценарий:Я создал форму с несколькими полями ввода.Одно из полей ввода текста имеет базовый прослушиватель событий, который улавливает событие «изменения».
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 - и просто у пользователя нажмите клавишу Enter, или ключ вкладки, когда завершится ввода символов.Таким образом, он будет только уволен один раз.Попытка построить таймер, может не работать, если пользователь паузы, чтобы искать что-то.
или если заказ # всегда одинаковая длина (то есть 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
.