Przechodzenie miedzy oknami edit

0

Mam problem z przechodzeniem pomiędzy oknami edit. Napisałem kawałek kodu. Gdy na jednym oknie nacisnę enter, to kursor przechodzi automatycznie na kolejne okno. Wszystko pięknie działa ale tylko na formularzu pierwszym. Na Form2 niestety nie chce działać. Poniżej fragment kodu. Kto mi może powiedzieć co tu trzeba poprawić?

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
  begin
   Form2.edit2.setFocus;
   Key := #0 ;
  end;
end;
1

To sie nie tak robi. Ustaw wszystkim Ediom odpowiednią właściwość TabOrder (liczy w takiej kolejności jak maja przechodzić) a później podepnij wszystkie pod jedno (to samo) zdarzenie OnKeyPress

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key = #13) then  //czy enter
  begin
    (Self as TControl).Perform(WM_NEXTDLGCTL,0,0); //wysyla komunikat powodujacy przejscie do nastepnej kontrolki
    Key:= #0; //niekonieczne ale wycisza dzwiek systemowey przy przechodzeniu
  end;
end;
1

W razie czego, inne pomysły są również w tym wątku: https://stackoverflow.com/questions/6773400/focus-next-control-on-enter-in-overridden-keyup

0
kAzek napisał(a):

To sie nie tak robi. Ustaw wszystkim Ediom odpowiednią właściwość TabOrder (liczy w takiej kolejności jak maja przechodzić) a później podepnij wszystkie pod jedno (to samo) zdarzenie OnKeyPress

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key = #13) then  //czy enter
  begin
    (Self as TControl).Perform(WM_NEXTDLGCTL,0,0); //wysyla komunikat powodujacy przejscie do nastepnej kontrolki
    Key:= #0; //niekonieczne ale wycisza dzwiek systemowey przy przechodzeniu
  end;
end;

Dokładnie zachowuje się tak samo jak mój kod. Na Form1 działa prawidłowo na Form2 nie działa nadal.

0

A podłączyłeś to zdarzenie do kontrolek na drugim formularzu?

0

Postaw breakpointa i sprawdź czy w ogóle zdarzenie się wykonuje.

0
furious programming napisał(a):

A podłączyłeś to zdarzenie do kontrolek na drugim formularzu?

Możesz jaśniej ?

0

@zew10: zdarzenie podane przez @kAzek jest napisane tak, aby nie było zależne od kontrolki – używa Self i nie odwołuje się bezpośrednio do zawartości konkretnego formularza. Dlatego też jest uniwersalne – można je podłączyć pod dowolny komponent obsługujący zdarzenie OnKeyPress (nie tylko pola edycyjne), znajdujący się na dowolnym formularzu.

Aby podłączyć jedno zdarzenie pod wiele kontrolek, wystarczy wszystkie te kontrolki zaznaczyć w designerze, następnie przejść do okna Object Inspector, przejść do zakładki Events, odszukać na liście zdarzenie OnKeyPress i z rozwijanej listy wybrać to wygenerowane. Na koniec wystarczy zapisać zmiany, przekompilować projekt i uruchomić.

0

Aby podłączyć jedno zdarzenie pod wiele kontrolek, wystarczy wszystkie te kontrolki zaznaczyć w designerze, następnie przejść do okna Object Inspector, przejść do zakładki Events, odszukać na liście zdarzenie OnKeyPress i z rozwijanej listy wybrać to wygenerowane. Na koniec wystarczy zapisać zmiany, przekompilować projekt i uruchomić.

Rzeczywiście teraz działa. Nie bardzo rozumiem co to zmieniło ale zmieniło i działa - eureka.

0
zew10 napisał(a):

Nie bardzo rozumiem co to zmieniło ale zmieniło i działa - eureka.

Zdarzenie zostało wygenerowane dla komponentu TForm1.Edit3 i działało tylko dla niego, więc jeśli nie było podpięte pod kontrolki na drugim formularzu to jak niby miałoby dla nich działać? No właśnie – nijak.

To co zasugerowałem pozwoliło podłączyć to samo zdarzenie do wielu komponentów. Dzięki temu one wszystkie korzystają z tego samego kawałka kodu – nie trzeba wiele razy pisać tego samego.

2

Dlatego uważam, że to jest średnie rozwiązanie ponieważ za każdym razem po dodaniu nowej kontrolki trzeba podłączać jej zdarzenie. Ja u siebie wykorzystuję zdarzenie OnKeyDown dla TForm. Tylko wtedy trzeba pamiętać aby właściwość KeyPreview ustawić na true.

1 użytkowników online, w tym zalogowanych: 0, gości: 1