Вопрос

Мой сценарий:Я создал форму с несколькими полями ввода.Одно из полей ввода текста имеет базовый прослушиватель событий, который улавливает событие «изменения».

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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top