Automatyczne przejście do następnego Edita

0

Ustawiłem blokadę wpisania tylko jednego znaku do TEdit, ale obok siebie mam 4 różne Edity, które muszę uzupełnić. Chciałbym, aby po wpisaniu jednego, kursor od razu przeskakiwał do następnego.
Próbowałem to zrobić tak jak poniżej, ale nie daje to efektu jaki bym chciał

 
if Length(Edit6.Text) = 1 then
  Key := #9 
 
3

Jeżeli kolejny TEdit do sfocusowania ma właściwość TabOrder o jeden większą od tego co aktywnej kontrolki, to pod Lazarusem sprawdziłem, że działa prawidłowo taki kod w OnChange dla Edita/ów.

//...
var
  Edt : TEdit;
begin
  Edt := TEdit(Sender);
  if Edt <> nil then
  begin
    if Length(Edt.Text) = 1 then
    begin
      SelectNext(Edt, True, True);
    end;
  end;
end;

Można też procedurze SelectNext, jako pierwszy parametr podać na przykład ActiveControl.

0

Ten kod musi być w zdarzeniu każdego Edita? Czy da się to jakoś połączyć?

2

Nie musi. Dlatego mój kod został napisany tak, jak widzisz. Wklejasz go dla jednego Edit w zdarzenie OnChange. A później po wybraniu pozostałych Editów w Inspektorze Obiektów na zakładce Zdarzenia przy OnChange z listy wybierasz z listy te, do którego wkleiłeś. Polecam Tobie przeczytać jakieś kursy. Gdyż zadałeś pytanie, które może do super podstaw nie zaliczę. Ale masz problemy z banalnymi podstawami obsługi IDE do tworzenia w obiektowym Pascalu.

0

@dani17 - tylko poustawiaj prawidłowe wartości dla właściwości TabOrder wszystkich komponentów, aby także za pomocą tabulatora można było fokusować kolejne wizualnie komponenty; Osobiście denerwuje mnie to, jak chcę przejść tabulatorem do sąsiedniego komponentu, a tu fokusuje się zupełnie inny; Brak sensownej kolejności jest bolączką dla użytkownika.

0
olesio napisał(a):

Nie musi. Dlatego mój kod został napisany tak, jak widzisz. Wklejasz go dla jednego Edit w zdarzenie OnChange. A później po wybraniu pozostałych Editów w Inspektorze Obiektów na zakładce Zdarzenia przy OnChange z listy wybierasz z listy te, do którego wkleiłeś. Polecam Tobie przeczytać jakieś kursy. Gdyż zadałeś pytanie, które może do super podstaw nie zaliczę. Ale masz problemy z banalnymi podstawami obsługi IDE do tworzenia w obiektowym Pascalu.

Ja wiem o co chodzi, tylko do tej pory nie robiłem tego w taki sposób. Kursy jakieś czytałem, ale najwięcej się uczę, robiąc coś i testując. Tak na prawdę teraz dowiedziałem się jednej ważnej rzeczy z Twojej odpowiedzi. Ja zawsze dla każdego komponentu robiłem oddzielne zdarzenie nawet jeśli kod był taki sam. Teraz to wszystko poprawię. Wielkie dzięki.

P.S. Ewentualnie miałbym jeszcze jedno pytanie, aczkolwiek mam już pomysł jak to zrealizować. Jednak nie wiem czy to się uda. Chciałbym aby po kliknięciu przycisku otwierał się dodatkowy panel z tymi Editami. To wszystko działa. Ale co zrobić, żeby kursor automatycznie był w pierwszym z nich?

1

Tak, z tym mam drobny problem. Bo na jednym panelu mam 4 Edity i jeden ComboBox. Chciałbym przemieszczać się tylko pomiędzy Editami. Aby nie możliwa była obsługa ComboBoxa za pomocą klawiatury.

ComboBox (i inne komponenty dziedziczące po TWinControl) ma właściwość TabStop - ustaw ją na False i nie będzie można go sfokusować klawiaturą.

0
dani17 napisał(a):

P.S. Ewentualnie miałbym jeszcze jedno pytanie, aczkolwiek mam już pomysł jak to zrealizować. Jednak nie wiem czy to się uda. Chciałbym aby po kliknięciu przycisku otwierał się dodatkowy panel z tymi Editami. To wszystko działa. Ale co zrobić, żeby kursor automatycznie był w pierwszym z nich?

Niestety przeceniłem swoje możliwości. Kod poniżej nie działa tak jak bym chciał.

 
procedure TBuk.Button1Click(Sender: TObject);
begin
  Edit1.SetFocus;
  PanelMenuGlowne.Visible := False;
  PanelDodaj.Visible := True;
end; 

Edit1.SetFocus; odsyła mnie do pliku customform.inc, konkretnie do raise EInvalidOperation.Create(SCannotFocus);.

2
procedure TBuk.Button1Click(Sender: TObject);
begin
  PanelMenuGlowne.Visible := False;
  PanelDodaj.Visible := True;
  Edit1.SetFocus; // nie możesz dawać focus na pole które wciąż nie jest widoczne.
end;

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