Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsames verhalten von TDateTime mit if (https://www.delphipraxis.net/143711-seltsames-verhalten-von-tdatetime-mit-if.html)

Mariaki 21. Nov 2009 18:37


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:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  if DT.DateTime=Time then
    showmessage('Test');
end;
DT ist der Picker.
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:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  if DateTimeToStr(DT.DateTime)=DateTimeToStr(Time) then
    showmessage('Test');
end;
Und siehe da.. es funktioniert!!!! :gruebel:
Nun Frag ich mich wiso das so geht, aber nicht direckt???


P.S.: Ist eine Reine Wissens-Frage... Ich werd es jetzt so machen.

jfheins 21. Nov 2009 18:47

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 ;)

Luckie 21. Nov 2009 18:48

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.

toms 21. Nov 2009 18:48

Re: Seltsames verhalten von TDateTime mit if
 
Gibt mal ShowMessage(FloatToStr(Time)) aus. Was für einen Wert siehst du?

himitsu 21. Nov 2009 18:54

Re: Seltsames verhalten von TDateTime mit if
 
Zitat:

Zitat von toms
Gibt mal ShowMessage(FloatToStr(Time)) aus. Was für einen Wert siehst du?

Da die Unterschiede auch sehr klein sein können ...
Delphi-Quellcode:
ShowMessage(FloatToStr(DT.DateTime - Time));
hier sieht man den Unterschied und es ist sehr unwahrscheinlich,
daß hier mal genau 0 rauskommt. (aus oben schon genannten Gründen)

Mariaki 21. Nov 2009 18:58

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

wicht 21. Nov 2009 19:07

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...

himitsu 21. Nov 2009 19:18

Re: Seltsames verhalten von TDateTime mit if
 
Bei = müssen die Werte absolut genau gleich sein.

Luckie 21. Nov 2009 19:19

Re: Seltsames verhalten von TDateTime mit if
 
Zitat:

Zitat von Mariaki
@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.

Das ist mir klar. Aber ist dir schon mal der Gedanke gekommen, dass in DT.DateTme das Datum mit drinstreckt und in Time nur die zeit?

Zitat:

2. Wenn der timer nen intervall von 1 hat wird keine sekunder übersprungen.
Wollen wir wetten dass er es tut? Der Timer hat unter Windows NT eine Mindestauflösung von 15 Millisekunden. Des Weiteren haben Timer Nachrichten eine sehr geringe Priorität im System. Ist das System ausgelastet, werden die Timer Nachrichten ganz hinten eingereiht.

alzaimar 21. Nov 2009 20:08

Re: Seltsames verhalten von TDateTime mit if
 
Zitat:

Zitat von Luckie
Aber ist dir schon mal der Gedanke gekommen, dass in DT.DateTime das Datum mit drinstreckt und in Time nur die zeit?

Warum würde es dann DT.DateTime heißen? :gruebel:

Ein Wecker klingelt übrigens dann, wenn die Zeit abgelaufen ist. Also würde ich sowas mal versuchen:
1.Idee;
Delphi-Quellcode:
If WeckZeit >= AktuellesZeit Then
  Wecken;
Blöd, denn dann klingelt der Wecker ja immer.
Wenn der Wecker aber jeden Tag, aber nur 1x am Tag wecken soll, dann so:
Delphi-Quellcode:
If (WeckZeit >= AktuellesZeit) And HeuteNochNichtGeweckt Then
  Wecken;
Oho. wie würde man das 'Heute noch nicht geweckt' implementieren? In dem man sich beim Wecken merkt, das man heute geweckt hat.
Delphi-Quellcode:
If (WeckZeit >= AktuellesZeit) And (WeckTag<HeutigerTag) Then Begin
  WeckTag := HeutigerTag;
  Wecken;
End;
Und schon hat man einen Wecker, der auch dann weckt, wenn man den Wecker zu spät gestartet hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Seite 1 von 2  1 2      

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