TDateEdit - Fehler(?)

Rund um die LCL und andere Komponenten
Antworten
vx-rexx
Beiträge: 21
Registriert: Do 11. Mär 2010, 10:21

TDateEdit - Fehler(?)

Beitrag von vx-rexx »

Ich möchte gern TDateEdit nutzen, stosse jedoch auf eine Merkwürdgkeit:

Es sind immer unterschiedliche Werte in OnChange, OnExit und OnAcceptDate vorhanden.
Ich habe ein kleines Beispiel angefügt, bei dem dieses Verhalten sehr schön deutlich wird.

Mein Verständnis von TDateEdit ist eigentlich: egal wie das Datum geändert wird (Maus/Tastatur) - das Endergebnis sollte immer das Gleiche sein.

Lazarus Version #: 1.1
Datum: 2012-04-18
FPC-Version: 2.6.1
SVN-Revision: 36892
i386-win32/win64

vx-rexx
Dateianhänge
source.out.zip
TDateEdit-Test
(2.99 KiB) 60-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TDateEdit - Fehler(?)

Beitrag von theo »

Ich hab's nur kurz auf Lazarus 1.1 r37165M FPC 2.7.1 x86_64-linux-gtk 2 angeschaut.
Hier sind OnExit und OnChange gleich.
Bei OnAcceptDate musst du halt den Parameter auswerten
Edit2.Text:=DateToStr(ADate);
Dann passt's auch da.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: TDateEdit - Fehler(?)

Beitrag von Bora4d »

Ja hast du recht. Nur OnChange ist zuverlässig. Aber onchange ist nicht zu gut weil es bei jede ZAhl änderung (man möchte von 1 auf 2 stellige Tag ändern) aufgerufen wird.
Ich finde OnEditingDone brauchbar aber der wird nur aufgerufen wenn man Enter drückt.

Das war auch bei Delphi schon so. Du kannst mit OnKeyDown (Enter auswerten) und OnAcceptDate das Problem beheben.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: TDateEdit - Fehler(?)

Beitrag von Bora4d »

Die Ereignisse werden auch aufgerufen wenn mann Datumfenster öffnet und schließt.
Ich würde es so machen:
1. Eine Prozedur definieren, z.B.

Code: Alles auswählen

procedure TForm1.DatumGeandert;
begin
  if AlteDatum=DateEdit1.Date then
     Exit;
 //ab hier eigene funktionen
end;


2. OnAcceptDate verwenden von da aus DatumGeandert Prozedur aufrufen

Code: Alles auswählen

procedure TForm1.DateEdit1AcceptDate(Sender: TObject; var ADate: TDateTime;
  var AcceptDate: Boolean);
begin
  DatumGeandert;
end;


2. OnKeyDown verwenden von da aus DatumGeandert Prozedur aufrufen

Code: Alles auswählen

procedure TForm1.DateEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=13 then DatumGeandert;
end;


Dann gibts kein Problem mehr.

Antworten