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

SzYbkI

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:

FAQ

4 komentarzy

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

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.

Dryo: Perform powinno być szybsze.

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;