![]() |
Seltsames verhalten von TDateTime mit if
Hi,
ich möchte eine kleine Weckfunktion in mein Prog einbauen. Da dachte ich mir nehmen ich die DateTimerPicker-Komponente. Also schrieb ich mir:
Delphi-Quellcode:
DT ist der Picker.
procedure TForm2.Timer1Timer(Sender: TObject);
begin if DT.DateTime=Time then showmessage('Test'); end; Dies funkionier leider nicht.. er macht einfach nichts zur angegebnen Zeit. :wall: Nun dachte ich das man das nicht direckt machen kann, also packte ich die angeben der Weckzeit und der aktuellen zeit in eigene Variablen... Funltioniert auch nicht. :wall: Nun hab ich zu der Zeit in der ich mit Delphi angefangen hab schonmal nen Wecker gemacht (mit Turbo Delphi, in dem es keinen DateTimePicker gibt). Ich machte das also über einen TEdit. Da kam mir die Idee das ganze nicht in TDateTime Variablen zu packen sondern in String:
Delphi-Quellcode:
Und siehe da.. es funktioniert!!!! :gruebel:
procedure TForm2.Timer1Timer(Sender: TObject);
begin if DateTimeToStr(DT.DateTime)=DateTimeToStr(Time) then showmessage('Test'); end; Nun Frag ich mich wiso das so geht, aber nicht direckt??? P.S.: Ist eine Reine Wissens-Frage... Ich werd es jetzt so machen. |
Re: Seltsames verhalten von TDateTime mit if
Naja, ein DateTime Wer ist ein double und als solcher schonmal nicht für den vergleich mit = geeignet. Außerdem ist der Tiumer ungenau (hat nur so ca. 20ms Auflösung)
Und der String ist wohl nur aus die Sekunde genau, weshalb der Vergleich klappt ;) |
Re: Seltsames verhalten von TDateTime mit if
Zwei sachen:
1. Was steht in DT.DateTime und was in Time? Kann das irgendwann überhaupt mal gleich werden? 2. Der Timer ist nicht sehr genau. Es können auch schon mal ein paar Sekunden übersprungen werden, dann trifft deine Bedingung nie zu. |
Re: Seltsames verhalten von TDateTime mit if
Gibt mal ShowMessage(FloatToStr(Time)) aus. Was für einen Wert siehst du?
|
Re: Seltsames verhalten von TDateTime mit if
Zitat:
Delphi-Quellcode:
hier sieht man den Unterschied und es ist sehr unwahrscheinlich,
ShowMessage(FloatToStr(DT.DateTime - Time));
daß hier mal genau 0 rauskommt. (aus oben schon genannten Gründen) |
Re: Seltsames verhalten von TDateTime mit if
@Lukie:
1. DT.DateTime ist wie gesagt der Picker und somit TDateTime und Time ist ne Systemvariable(wenn man das so nennt) und gibt die aktuelle Zeit an. 2. Wenn der timer nen intervall von 1 hat wird keine sekunder übersprungen. @toms/himitsu: Hab ioch auch schon ausprobiert.. es kommten die aktuellen zeiten.. das ist ja das was mich verwirrt.. alles passt.. nur bei dem = erkennt er es nicht |
Re: Seltsames verhalten von TDateTime mit if
Wenn du TDateTime direkt vergleichst sind da aber noch Millisekunden bei. Dann ist es sehr unwahrscheinlich, dass du Triffst. Und wie schon gesagt eignet sich der Wert nicht für einen Vergleich mit =, benutz < und > dafür. Da gibt es hier auch noch Threads zu, die das im Detail beschreiben.
Es funktioniert, wenn du DateTimeToStr() nimmst, weil der Wert dann nur bis in die Sekunden geht. Dass keine Sekunde übersprungen wird ist übrigens nicht sicher - wenn dein Programm durch äußere Umstände blockiert wird, oder wenn du gerade selbst etwas anderes abarbeitest und die Sekunde deshalb verpasst... |
Re: Seltsames verhalten von TDateTime mit if
Bei = müssen die Werte absolut genau gleich sein.
|
Re: Seltsames verhalten von TDateTime mit if
Zitat:
Zitat:
|
Re: Seltsames verhalten von TDateTime mit if
Zitat:
Ein Wecker klingelt übrigens dann, wenn die Zeit abgelaufen ist. Also würde ich sowas mal versuchen: 1.Idee;
Delphi-Quellcode:
Blöd, denn dann klingelt der Wecker ja immer.
If WeckZeit >= AktuellesZeit Then
Wecken; Wenn der Wecker aber jeden Tag, aber nur 1x am Tag wecken soll, dann so:
Delphi-Quellcode:
Oho. wie würde man das 'Heute noch nicht geweckt' implementieren? In dem man sich beim Wecken merkt, das man heute geweckt hat.
If (WeckZeit >= AktuellesZeit) And HeuteNochNichtGeweckt Then
Wecken;
Delphi-Quellcode:
Und schon hat man einen Wecker, der auch dann weckt, wenn man den Wecker zu spät gestartet hat.
If (WeckZeit >= AktuellesZeit) And (WeckTag<HeutigerTag) Then Begin
WeckTag := HeutigerTag; Wecken; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz