Question

Mon scénario :J'ai créé un formulaire avec plusieurs champs de saisie.L'un des champs de saisie de texte comporte un écouteur d'événement sous-jacent, qui rattrape l'événement « changement ».

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

Lorsque l'utilisateur saisit un numéro de commande spécifique, le rappel s'exécute pour chaque lettre/signe que l'utilisateur a déjà saisi dans le champ de texte.

Ma question: Existe-t-il une solution possible dans msaccess, pour créer un délai pour un masque de saisie spécifique ?

Par exemple: Un utilisateur tape un numéro de commande avec quelques chiffres.Lorsque le premier événement de changement est déclenché, une fonction de minuterie interne commence à décrémenter un compteur.Tant qu'une interaction supplémentaire se produit avec l'utilisateur, le minuteur manque de temps et appelle la fonction sous-jacente.Si entre-temps une saisie supplémentaire a été effectuée par l'utilisateur, le compteur doit être réinitialisé.

Par exemple:l'utilisateur tape "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
Était-ce utile?

La solution

Utilisez le formulaire Timer événement.Ensemble TimerInterval à zéro au chargement du formulaire.Ensuite, dans l'événement de changement de zone de texte, réinitialisez TimerInterval à la valeur de votre compte à rebours.

Note Me.orderID.Text est une propriété de texte et ne sera jamais Null.Vérifiez donc si sa longueur est supérieure à zéro 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

J'ai testé cette approche avec un exemple de formulaire dans Access 2007 et je pense qu'elle fait ce que vous avez demandé.Si vous vouliez faire quelque chose comme ça pour plus d’une zone de texte sur le même formulaire, cette suggestion ne suffirait pas.

Autres conseils

Je suggérerais que vous utilisiez plutôt l'événement _afterupdate à la place - et il suffit d'appuyer sur la touche Entrée ou de la touche TAB lorsque vous avez terminé de saisir des caractères.De cette façon, cela ne tirera que une fois.Essayer de construire une minuterie peut ne pas fonctionner non plus si l'utilisateur s'arrête pour rechercher quelque chose.

ou si le numéro de commande est toujours la même longueur (c'est-à-dire 6), vous pouvez faire:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top