Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DateTimePicker; OnChange-Ereignis automatisch 2 mal??? (https://www.delphipraxis.net/26355-datetimepicker%3B-onchange-ereignis-automatisch-2-mal.html)

TypusMensch 22. Jul 2004 14:08


DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Habe ein DateTimePicker auf meinem Formular. Aus Testzwecken wollte ich nun folgendes probieren:

Code:
procedure TFestbearbeit.DateTimePicker2Change(Sender: TObject);
begin
Showmessage(datetostr(DateTimePicker2.Date));
end;

Seltsamer Weise gibt er mir das Datum einmal aus, wenn ich das Datum per Tastatur angebe. Wenn ich aber via Kalenderdialog ändere, erscheint 2mal das Fenster mit dem angewählten Datum. Wie unterbinde ich das??? Ich will so oder so nur einmal das Fenster sehen!!!

ThX im vorraus.

TypusMensch 22. Jul 2004 15:43

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Keiner eine Ahnung??? :pale:

Memo 22. Jul 2004 16:20

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Delphi-Quellcode:
 var
  Form1: TForm1;
     i: Integer;
implementation

{$R *.dfm}

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
    i:=i+1;
    if i = 1 then
       Showmessage(datetostr(DateTimePicker1.Date))
    else
      i:=0;
end;
Was dümmeres fällt mir auf die Schnelle nicht ein.

SubData 22. Sep 2004 09:38

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Hab das selbe Problem....

Die Idee mit der Schleife ist ja so gesehen ganz nett, aber mich würde eher interessieren WARUM das überhaupt so ist :gruebel:

Stevie 23. Sep 2004 09:16

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Tja, das ist eigentlich ganz einfach: Bei einer Änderung des Datums wird zweimal die Nachricht CN_NOTIFY mit dem Parameter DTN_DATETIMECHANGE an den DateTimePicker gesendet und der ruft dann zweimal die Change-Methode auf. Man könnte das ganze gut und gerne als Bug bezeichnen.

Shaman 23. Sep 2004 10:07

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Aber Obacht beim Work-Around: OnChange wird nur zweimal ausgelöst, wenn man ein Datum im Kalender auswählt, aber nicht, wenn das Datum direkt im Edit geändert wird.

Gruss
Shaman

SubData 23. Sep 2004 10:09

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Zitat:

Zitat von Shaman
Aber Obacht beim Work-Around: OnChange wird nur zweimal ausgelöst, wenn man ein Datum im Kalender auswählt, aber nicht, wenn das Datum direkt im Edit geändert wird.

Gruss
Shaman

Ja das ist mir auch aufgefallen ...

Das Post von Stevie ist eigentlich das, was ich wissen wollte. Obs 'n Bug oder 'n Feature is *g*


Als Work-Around nehm ich übrigens einfach OnCloseUp ... Damit gehts ohne weitere Probs ^^

Shaman 23. Sep 2004 10:17

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
So sollte es auch gehen:

Delphi-Quellcode:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  if not FIgnoreChange then
  begin
    ShowMessage('Change');
    FIgnoreChange:= DateTimePicker1.DroppedDown
  end else
    FIgnoreChange:= False;
end;
Gruss
Shaman

himitsu 23. Sep 2004 10:22

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
So sollte es auch ganz gut gehn und nebenbei ein nettes Beispiel, wofür Tag gut sein kann :mrgreen:

Delphi-Quellcode:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  if DateTimePicker1.Tag = Trunc(DateTimePicker1.Date) then exit;
  DateTimePicker1.Tag := Trunc(DateTimePicker1.Date);
  Showmessage(datetostr(DateTimePicker1.Date));
end;
[add]
@Shaman
das NOT ist doch wohl nicht nötig?
einfach mal das Zeug vor und nach dem ELSE tauschen ;)

und man glaubt's nicht, aber mann kann massig Variablen einsparen, wenn man mal ein bissl mit Hilfe von Typenumwandlung rumspielt http://FNSE.de/S0AN.gif
Delphi-Quellcode:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  if LongBool(DateTimePicker1.Tag) then
    DateTimePicker1.Tag := Integer(False)
  else begin
    ShowMessage('Change');
    DateTimePicker1.Tag := Integer(DateTimePicker1.DroppedDown);
  end;
end;

Shaman 23. Sep 2004 10:38

Re: DateTimePicker; OnChange-Ereignis automatisch 2 mal???
 
Zitat:

Zitat von himitsu
@Shaman
das NOT ist doch wohl nicht nötig?
einfach mal das Zeug vor und nach dem ELSE tauschen ;)

Der interessantere Code kommt immer zuerst :wink:

Und den Tag spare ich mir für andere lustige Sachen auf :coder:

Gruss
Shaman


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz