문제

내 시나리오:여러 입력 필드가 있는 양식을 만들었습니다.텍스트 입력 필드 중 하나에는 "변경" 이벤트를 포착하는 기본 이벤트 리스너가 있습니다.

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 폼 로드 시 0으로 설정됩니다.그런 다음 텍스트 상자 변경 이벤트에서 재설정 TimerInterval 카운트다운 타이머 값으로 변경됩니다.

메모 Me.orderID.Text 텍스트 속성이며 Null이 될 수 없습니다.그러므로 길이가 0보다 큰지 확인하십시오. 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 키 또는 Tab 키를 누르면됩니다.그런 식으로 한 번만 발사 할 것입니다.사용자가 무언가를 찾으려고 일시 중지하면 타이머를 빌드하려고 할 수 없습니다.

또는 주문 번호가 항상 동일한 길이 (즉, 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