Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Editfeld als Sender


colaka - Sa 29.09.12 10:43
Titel: Editfeld als Sender
Hallo,

in einem Editfeld soll der Benutzer ein Datum eingeben, und ich möchte überprüfen, ob das Datum im richtigen Format eingegeben wurde. Dazu habe ich die folgende Prozedur in das On-Exit-Ereignis geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFKunden.Edit1Exit(Sender: TObject);
var
  Tag : TDateTime;
begin
  try
    Tag :=StrToDate(Edit1.Text);
  except
    ShowMessage('Das Datum muss im Format TT.MM.JJJJ eingegeben werden');
    Edit1.SetFocus;
  end;
end;


Das funktioniert auch, aber da ich 28 Editfelder habe, möchte ich den Code nicht 28 mal schreiben. Irgendwo habe ich schon mal gelesen, dass man das dann mit einem "Sender" machen kann. Alle meine bisherigen Versuche sind leider fehlgeschlagen.

Für einen kleinen Denkanstoss wäre ich sehr dankbar.

Gruß


mandras - Sa 29.09.12 10:49

Weise allen Datums-Edit-Feldern die gleiche Exit-Funktion zu:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Edit1Exit(Sender: TObject);
var
  Tag : TDateTime;
  S: TEdit;
begin
 if Sender is TEdit then begin
  S:=Sender as TEdit;
  try
    Tag :=StrToDate(S.Text);
  except
    ShowMessage('Das Datum muss im Format TT.MM.JJJJ eingegeben werden');
    S.SetFocus;
  end;
 end;
end;


Die Zwischenvariable S ist nicht erforderlich, erspart es einem aber jedesmal als "as TEdit" zu schreiben.


bummi - Sa 29.09.12 10:49


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFKunden.Edit1Exit(Sender: TObject);
var
  Tag : TDateTime;
begin
  try
    Tag :=StrToDate(TEdit(Sender).Text);
  except
    ShowMessage('Das Datum muss im Format TT.MM.JJJJ eingegeben werden');
    TEdit(Sender).SetFocus;
  end;
end;


wobei Tag etwas unglücklich gewählt sein könnte


Martok - Sa 29.09.12 20:13

Die Meldung stimmt übrigens nicht, StrToDate verwendet das Systemformat - und das muss nicht zwingend TT.MM.JJJJ sein. Außerdem ist das mit der Exception doof, wenn du nur prüfen willst.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFKunden.Edit1Exit(Sender: TObject);
var
  TestTag : TDateTime;
begin
  if not TryStrToDate(TEdit(Sender).Text, TestTag) then begin
    ShowMessage('Das Datum muss im Format '+ShortDateFormat+' eingegeben werden');
    TEdit(Sender).SetFocus;
  end;
end;



Und dann gibts da noch die Komponente TDateTimePicker, die auch noch einen Dropdown-Kalender mitbringt. Davon sind meine User immer total begeistert, weil das halt wesentlich mehr Komfort ist als selber tippen zu müssen ;-)


colaka - So 30.09.12 10:21

Hallo,

ich bin immer wieder erstaunt, wie elegant sich viele Sachen mit Delphi lösen lassen - wenn man weiss, wie es geht.

Vielen Dank


DonManfred - Mo 01.10.12 07:06

Du könntest deinen Usern auch noch ein Feature da einbauen und eine Funktion einsetzen.


Delphi-Quelltext
1:
2:
3:
4:
procedure Tfrmkunden.edit_gebdatumExit(Sender: TObject);
begin
  fnc.CheckDatumExit(Sender);
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure CheckDatumExit(obj: TPlannerDatePicker);
var dummy : string;
begin
  dummy :=  obj.Text;
  if LastPos('.', dummy) = 0 then begin
    if StrLen(pchar(trim(dummy))) = 6 then begin
      obj.Text := copy(dummy,0,2)+'.'+copy(dummy,3,2)+'.20'+copy(dummy,5,2);
    end;
    if StrLen(pchar(trim(dummy))) = 4 then begin
      obj.Text := copy(dummy,0,2)+'.'+copy(dummy,3,2)+'.'+FormatDateTime('yyyy', Now);
    end;
  end;
end;


So kann man sann "151011" eingeben und es wird daraus der 15.10.2011.
Oder einfch "1510" und es wird daraus 15.10.2012

Diese Procedure wird bei uns in allen Datumsfeldern verwendet und wird sehr intensiv von den Benutzern benutzt.