![]() |
Focus auf das nächste EditFeldes setzen
Problem:
Ich habe ein Form und darauf sind bestimmt 30 EditFelder drauf. Mit der Tabtaste kann ich diese nach der Reihe anspringen. Diese Editfelder sind aber nicht immer sichtbar, weil ich verschiedene Formulare haben möchte und die meisten gehören paarweise zusammen. z.B. edit2 objektnr edit3 objektname edit4 kontonr edit5 kontoname ... usw wenn ich nun edit2 etwas eingebe und dieses Feld verlasse und dieses nicht leer ist, dann gehe ich auf eine Datenbank und hole mit den entsprechenden Wert und trage ihn in edit3 ein. wenn ich edit3 verlasse und dieses Feld nicht leer ist, gehe ich auch auf die Datenbank und hole mir einen entsprechenden Wert und trage ihn in Edit2 ein. In diesem Falle ist der Focus dann schon in Edit4 durch drücken der Tabtaste. Problem ist nur im ersten Fall, wenn ich dir nr-Felder verlasse, dann ist der Focus dem jeweiligen name-Feld. Dies führt dazu, dass er bei verlassen dieses Feldes auch auf die Datenbank geht, aber ich genau in diesem speziellen Fall das nicht mehr möchte, da ich es gerade erst gefüllt habe. Wie kann ich den Focus auf das jeweils übernächste sichtbare EditFeld setzen? Gibt es dafür eine Funktion, die mir entgangen ist? Hab bisher nichts gefunden. viele Grüsse Susanne |
Re: Focus auf das nächste EditFeldes setzen
Hallo Susanne,
keine Ahnung ob ich das verstanden habe was Du willst, aber Du kannst die Ereignisse davon abhängig machen, ob das Feld focussiert ist oder nicht (If Edit2.Focused). Gruß :-D Milo |
Re: Focus auf das nächste EditFeldes setzen
Ja, ja der alte Kundenwunsch, alles automatisch zu erledigen (nur enter drücken und fertig).
Das gibt diverse Probleme, die du mindestens zum Teil schon erlebt hast: 1. Editfeld wird verlassen und die Aktion wird ausgeführt, obwohl gar nichts verändert wurde. 2. Der Focus soll in abhängigkeit eines Zustands irgendwo hinspringen, und nicht zum nächsten Eingabefeld. Lass uns dein Problem vereinfachen: A+5=C Eingabe A ENTER: C soll ausgerechnet werden. Eingabe C ENTER: A soll ausgerechnet werden. Wie kann man das lösen? Ich würde folgendes machen: 1. OnEnter-Ereignis der Eingabefelder definieren:
Delphi-Quellcode:
Im o.g. Beispiel Wird also EditA.OnEnter und EditB.OnEnter auf diese Methode zeigen.
Procedure TMyForm.Edit1Enter (Sender : TObject)
Begin LastEditField := Sender AS TEdit; End; Damit weisst Du, wo der Focus vorher war, wenn er gerade nicht in einem der besagten Edit-Fields ist. Dann schmeisst du ein Button auf die Form mit 'Default=True'. Left = -100, also unsichtbar. Tabstop = False, damit der Button nicht fokusierbar ist (per Tab). Durch 'Default=True' reagiert der Button auf 'ENTER'. Im OnClick-Ereignis des Buttons führst Du dann die Funktion aus. Über 'LastEditField' weisst Du genau, woher der Focus kam, bzw. in welchem Edit-Feld der Anwender zuletzt war und wo Du nun hinspringen musst. Auf unser Beispiel angewandt:
Delphi-Quellcode:
Es geht natürlich auch über OnKeyPress, aber ich finde, mit einem versteckten Button ist es nachvollziehbarer.
Procedure TMyform.EnterButtonClick (Sender : TObject);
Begin If LastEditField = EditA Then Begin // Focus war auf 'A', C soll ausgerechnet werden EditC.Text := IntToStr (StrToInt (EditA.Text) + 5)); EditA.SetFocus; End Else Begin EditA.Text := IntToStr (StrToInt (EditC.Text) - 5)); EditC.SetFocus; End End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz