Pregunta

Mi escenario:He creado un formulario con múltiples campos de entrada.Uno de los campos de entrada de texto tiene un detector de eventos subyacente, que detecta el evento de "cambio".

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

Cuando el usuario ingresa un número de pedido específico, la devolución de llamada se ejecuta para cada letra/signo que el usuario ya haya escrito en el campo de texto.

Mi pregunta: ¿Existe una posible solución en msaccess para crear un retraso de tiempo para una máscara de entrada específica?

Por ejemplo: Un usuario está escribiendo un número de pedido con algunos dígitos.Cuando se activa el primer evento de cambio, una función de temporizador interno comienza a disminuir un contador.Mientras se produzca una interacción adicional con el usuario, el temporizador se quedará sin tiempo y llamará a la función subyacente.Si mientras tanto el usuario ha realizado entradas adicionales, se debe restablecer el contador.

Por ejemplo:el usuario escribe "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
¿Fue útil?

Solución

Usa el formulario Timer evento.Colocar TimerInterval a cero al cargar el formulario.Luego, en el cuadro de texto cambiar evento, restablecer TimerInterval al valor del temporizador de cuenta regresiva.

Nota Me.orderID.Text es una propiedad de texto y nunca será nula.Por lo tanto, compruebe si su longitud es mayor que cero en 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

Probé ese enfoque con un formulario de muestra en Access 2007 y creo que hace lo que usted solicitó.Si quisiera hacer algo como esto para más de un cuadro de texto en el mismo formulario, esta sugerencia no sería suficiente.

Otros consejos

Sugeriría que use el evento _Afterupdate, y simplemente haga que el usuario presione la tecla ENTER, o la tecla TAB cuando termine de ingresar caracteres.De esa manera, solo disparará una vez.Es posible que el intento de construir un temporizador sea posible, ya sea si el usuario se detiene para buscar algo.

O si el número # es siempre la misma longitud (es decir, 6), podría hacer:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top