2011-09-05 13 views
5

Mam dwie kontrolki TEdit. Gdy wejdę poza zakładkę edit1, edit2 otrzymuje fokus. Na moim przypadku onExit z Edit1 Mam następujący kod:Tehit focus & caret

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
end; 

Edit2 ma ostrość. Jednak nie ma w tym nic dziwnego. Mogę zacząć pisać, ale jest to mylące, ponieważ nie wiem, , na którym koncentruje się kontrola.

Jestem bardziej zainteresowany tym, co się dzieje z odwracaniem właściwości Włączone, które powoduje, że niektóre wiadomości nie są prawidłowo uruchamiane? Na przykład zdarzenie On2nter2 w edycji ed2 nie jest wyzwalane.

Jest to na D2006, jeśli ma to znaczenie.

Dzięki za odpowiedź.

+1

Dlaczego chcesz to zrobić? –

+0

Istnieje kilka kodów między wyłączaniem i włączaniem edit2. to niekoniecznie edit2, ale cokolwiek to jest activecontrol. więc po ponownym włączeniu activecontrol, chciałbym zresetować fokus w nim. Cóż, to na pewno jest aktywna kontrola, ale nie ma żadnej troski. – Rick

Odpowiedz

8

Nie rozumiem, dlaczego wyłączyć i włączyć edit2, ale trzeba to zrobić:

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
    PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0); 
end; 

BTW, zgadzam się z Andreasem Rejbrand.

+1

Ja osobiście wolę takie podejście , jeśli przypisano (ActiveControl), następnie PostMessage (ActiveControl.Handle, WM_SETFOCUS, 0,0); po ustawieniu ostrości na inny element sterujący. Po niektórych operacjach Windows api wydaje się nie rozpoznawać aktywnej kontroli, dlatego zdarzenia OnExit/OnEnter nie uruchamiają się poprawnie. Ta linia to koryguje. – ertx

+0

Zgadzam się, ale nie wiem, czy może on skupić się na innym komponencie ... – Whiler

+0

To działa, dziękuję! Próbowałem prześledzić łańcuch zdarzeń, zastanawiając się, dlaczego nie przerysuje ostrości i kija. Uderz w ścianę na WndProc, a ona po prostu zapętla się i straciłem kontrolę nad tym, co przekazuje jej przetwarzanie. – Rick

8

Poważnie podejrzewam, że robisz coś w zły sposób, a najlepszym rozwiązaniem jest najprawdopodobniej przeprojektowanie. Nie powinno się wyłączać, a następnie włączać kontrolki podczas odbierania fokusu.

+0

Zgadzam się, to nie jest idealne. I na pewno są rozwiązania. Ale ciekawi mnie tylko to, co jest wymagane, aby karetka i fokus mogły się pokazać. Coś o wyłączeniu activecontrol w/w zdarzeniu OnExit, które przerywa łańcuch komunikatów systemu Windows. – Rick

0

Istnieje kilka kodów między wyłączaniem i włączaniem edit2.

Mając dużo kodu w onExit obsługi zdarzeń z poprzedniego aktywnego sterowania robi nie wymagać, aby wyłączyć następną aktywną kontrolę. Ten kod wykona wykonać przed następnym aktywnym sterowaniem pokaże kreskę i będzie mógł odbierać dane wejściowe użytkownika. Po prostu upewnij się, że nie przepuszcza on wykonywania przez coś takiego jak uruchomienie nowego wątku lub użycie Application.ProcessMessages.

Ustaw Screen.Cursor na crHourGlass, aby upewnić się, że użytkownik nie jest gotowy do następnej aktywnej kontroli.

0

Znaleziono problem, gdy funkcja OnActive for MainForm aktywuje inny formularz.

TMainForm.OnActivate; 
begin 
ChildForm.ShowModal; 
end; 

Ostrość sterowania jest ustawiona, ale nie działa. Praca wokół znalazłem wysyłanie wiadomości PostMessage (Handle, WM_SETFOCUS, 0, 0); do uchwytu formularza.

procedure TChildForm.FocusControl(AWinControl: TWinControl); 
begin 
    try 
    // http://stackoverflow.com/questions/7305296/tedit-focus-caret 
    PostMessage(Handle, WM_SETFOCUS, 0, 0); 
    PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0); 
    if AWinControl.CanFocus then 
     AWinControl.SetFocus; 
    except 
    on E: Exception do 
    begin 
     Error(Self, E); 
    end; 
    end; 
end;