Domanda

My Scenario: Ho costruito un modulo con più campi di input.Uno dei campi di immissione del testo ha un listener di eventi sottostanti, che prende il "cambiamento" evento.

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

Quando l'utente digita in un numero specifico di ordine, viene eseguito il callback per ciascuna lettera / segno che l'utente ha già digitato nel campo di testo.

La mia domanda: Esiste una soluzione possibile in MSAccess, per creare un ritardo di tempo per una maschera di ingresso specifica?

Ad esempio: Un utente sta digitando un numero d'ordine con alcune cifre.Quando viene sparato il primo evento di modifica, una funzione Timer interna inizia a diminuire un contatore.Finché ora si verifica un'interazione aggiuntiva con l'utente, il timer viene esaurito e chiama la funzione sottostante. Se nel frattempo, l'ingresso aggiuntivo ha effettuato dall'utente, il contatore deve essere resettato.

Ad esempio: Tipi di utente in "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
.

È stato utile?

Soluzione

Utilizzare il modulo Timer Event.Impostare TimerInterval a zero a zero al carico del modulo.Quindi, nell'evento di modifica della casella di testo, ripristinare TimerInterval sul valore del timer del conto corrente.

Nota Me.orderID.Text è una proprietà di testo e non sarà mai nullo.Pertanto, controlla se la sua lunghezza è maggiore di zero in 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
.

Ho testato quell'approccio con un modulo campione in Access 2007 e penso che fa ciò che hai richiesto.Se volessi fare qualcosa del genere per più di una casella di testo sullo stesso modulo, questo suggerimento non lo taglierebbe.

Altri suggerimenti

Suggerirei di utilizzare invece l'evento _AfterUpdate - e basta avere l'utente premere il tasto INVIO o il tasto TAB quando è terminato inserire i caratteri.In questo modo si accenderà solo una volta.Cercare di costruire un timer potrebbe non funzionare né se l'utente si ferma per cercare qualcosa.

o se l'ordine # è sempre la stessa lunghezza (I.e. 6), potresti fare:

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top