Pergunta

Meu cenário:Eu construí um formulário com vários campos de entrada.Um dos campos de entrada de texto possui um ouvinte de evento subjacente, que captura o evento "alteração".

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 o usuário digita um número de pedido específico, o retorno de chamada é executado para cada letra/sinal que o usuário já digitou no campo de texto.

Minha pergunta: Existe uma solução possível no msaccess para criar um atraso para uma máscara de entrada específica?

Por exemplo: Um usuário está digitando um número de pedido com alguns dígitos.Quando o primeiro evento de alteração é acionado, uma função de temporizador interno começa a decrementar um contador.Contanto que ocorra interação adicional com o usuário, o tempo do cronômetro esgota-se e chama a função subjacente.Se, entretanto, o usuário tiver feito entradas adicionais, o contador deverá ser zerado.

Por exemplo:usuário digita "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
Foi útil?

Solução

Use o formulário Timer evento.Definir TimerInterval para zero no carregamento do formulário.Em seguida, na caixa de texto alterar evento, redefina TimerInterval ao valor do temporizador de contagem regressiva.

Observação Me.orderID.Text é uma propriedade de texto e nunca será nula.Portanto, verifique se seu comprimento é maior que zero em 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

Testei essa abordagem com um formulário de exemplo no Access 2007 e acho que ela atende ao que você solicitou.Se você quisesse fazer algo assim para mais de uma caixa de texto no mesmo formulário, esta sugestão não seria suficiente.

Outras dicas

Eu sugiro que você use o evento _AfterUpdate - e apenas faça com que o usuário pressione a tecla Enter ou a tecla Tab quando terminar de inserir os caracteres.Dessa forma, ele disparará apenas uma vez.Tentar construir um cronômetro também pode não funcionar se o usuário fizer uma pausa para procurar algo.

Ou se o número do pedido tiver sempre o mesmo comprimento (ou seja,6), você poderia fazer:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top