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.