Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Focus auf das nächste EditFeldes setzen

  Alt 7. Apr 2006, 13:15
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:
Procedure TMyForm.Edit1Enter (Sender : TObject)
Begin
  LastEditField := Sender AS TEdit;
End;
Im o.g. Beispiel Wird also EditA.OnEnter und EditB.OnEnter auf diese Methode zeigen.

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:
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;
Es geht natürlich auch über OnKeyPress, aber ich finde, mit einem versteckten Button ist es nachvollziehbarer.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat