Programowanie w języku Delphi » FAQ

Jak przejść z jednego komponentu TEdit do drugiego(bez używania Tab)

  • 2007-07-03 19:07
  • 4 komentarze
  • 1674 odsłony
  • Oceń ten tekst jako pierwszy
Należy zmienić obsługę klawisza Enter w każdym z komponentów klasy TEdit W tym celu należy wygenerować następującą procedurę zdarzeniową, zdarzenia OnKeyPress:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#13 then// Po naciśnięciu Entera..
 begin
  Perform(wm_NextDlgCtl,0,0); //Przenieś do nastepnego Edita
  Key:=#0;
 end;
end;


Zamiast powyższego możemy dodać do formy obsługę OnKeyUp:

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if (Key=VK_RETURN) and ([ssCtrl,ssShift]*Shift=[]) then
  Perform(WM_NEXTDLGCTL,0,0); //Przenieś do nastepnego Edita
end;


Dodatkowo ustawiamy właściwość formy KeyPreview na True. Wtedy Enter działa jak klawisz Tab na całej formie a nie tylko wybranych kontrolkach.

Jeżeli chcemy, aby po wpisaniu w kontrolce, dajmy na to - 4 znaków - nastąpiło przeniesienie kursora do kolejnej kontrolki TEdit, należy wygenerować zdarzenie OnChange:

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Length(Edit1.Text) >= 4 then //Jesli w Edicie sa 4 znaki to..
  begin
    Perform(wm_NextDlgCtl,0,0); //Przenieś do nastepnego Edita
  end;
end;


Zobacz także:

4 komentarze

sochalewski 2007-02-20 14:45

nie lepiej:
procedure Edit1.OnKeyPress(Sender: TObject; var Key: Char);
begin
ik key=#13 then begin Edit2.SelectAll; //alboOnClick?
end;
end;

Wodzu 2003-03-18 14:59

Czasami zdarza sie tak, ze nastepne pole Edit (czy tez inny obiekt) do ktorego chcemy przejsc za pomoca Taba, Entera itd. nie pojawia sie w tej kolejnosci w ktroej bysmy chcieli. Wystarczy wtedy ustawic "TabOrder" co rozwiaze ten problem.

Vogel 2003-01-11 16:15

Dryo: Perform powinno być szybsze.

Dryobates 2003-01-11 12:56

Strasznie dużo kombinujesz. Nie wystarczy:
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    Form1.FindNextControl(Form1.ActiveControl, True, True, True).SetFocus;
end;