2013-09-24 31 views
7

Mam formularz dostępu z polem tekstowym, który ma na celu umożliwienie wielokrotnego wpisywania numeru, wciskania klawisza Enter i zezwalania skryptowi na wykonywanie czynności. Aby uzyskać prędkość, pole powinno zachować ostrość po wykonaniu DoStuff().Dlaczego mój .setfocus jest ignorowany?

Jednakże, chociaż jestem pewien, że uruchamiany jest DoStuff(), fokus zawsze przechodzi do następnego pola w kolejności tabulacji. To tak, jakby ignorowano Me.MyFld.SetFocus.

Jak zachować koncentrację na tym polu po DoStuff()?

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer) 
    If KeyCode = vbKeyReturn Then 
     DoStuff 
     Me.MyFld.SetFocus 
    End If 
End Sub 
+0

spróbować bardziej odpowiednie zdarzenie - AfterUpdate tekstowym – 4dmonster

+0

Czy próbowałeś przechodzeniu z debuggera aby sprawdzić, czy cokolwiek innego jest uruchomiony po 'metody SetFocus'? – techturtle

+0

@ 4dmonster, jeśli używam innego zdarzenia, skąd mam wiedzieć, czy bieżącym klawiszem jest klawisz Enter? 'AfterUpdate' nie uwzględnia tego i' OnKeyPress' jest dla zwykłych znaków, a nie klawisza Enter (lub tak, jak czytałem). – PowerUser

Odpowiedz

12

Jeśli spojrzeć na the order of events for a keypress that would change focus, można zobaczyć, że zawsze zachowuje ten wzór:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus 

Możesz ponownie ustawić ostrość w dowolnym miejscu tam i będzie nadal zachować następujący wzór. Musimy więc powiedzieć, żeby przestała podążać za wzorcem. Zamień swój Me.MyFld.SetFocus na DoCmd.CancelEvent i powinno to naprawić twój problem. Zasadniczo, to po prostu wykopuje cię z powyższego schematu, więc zdarzenia Exit i LostFocus nigdy nie wystrzeliwują ...

+0

+1 za podanie źródła. Nie stworzyłem żadnego z tych zdarzeń dla tego pola tekstowego, więc na początku nie widzę, jak to ma znaczenie (być może w jednym z nich jest niejawny klawisz Tab?) Jednak "DoCmd.CancelEvent" działa dokładnie tak, jak chciałem :) – PowerUser

+0

Wydarzenia te są uruchamiane dla dowolnego projektu, niezależnie od tego, czy dodałeś do nich niestandardowy kod, czy nie. Po naciśnięciu klawisza Enter rozpoczyna się ta sekwencja. Po zakończeniu zdarzeń Exit i LostFocus na twoim pierwszym panelu TextBox, będzie on kontynuował następną kontrolę w kolejności tabulacji i uruchamia zdarzenia: 'Enter → GotFocus → KeyPress → KeyUp' – techturtle

+2

Muszę zapytać. Po uruchomieniu 'LostFocus' na pierwszym polu tekstowym, dlaczego miałby przejść do następnej kontrolki w kolejności tabulacji? Użytkownik nie nacisnął klawisza Tab, tylko Enter. – PowerUser

5

Obejście powoduje przeniesienie fokusu do innej kontrolki, a następnie z powrotem do pierwszego elementu sterującego. Tak:

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer) 
    If KeyCode = vbKeyReturn Then 
     DoStuff 
     Me.anotherControl.SetFocus 
     Me.MyFld.SetFocus 
    End If 
End Sub