Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 Komme nicht weiter mit Zeitvergleichen? (https://www.delphipraxis.net/141933-komme-nicht-weiter-mit-zeitvergleichen.html)

AlexII 19. Okt 2009 12:12


Komme nicht weiter mit Zeitvergleichen?
 
Hallo,
ich möchte einen Wecker schreibe und hab folgendes geschrieben:

Delphi-Quellcode:
procedure TForm4.FormShow(Sender: TObject);
begin
DateTimePicker2.Time:=Now;
end;

procedure TForm4.Timer1Timer(Sender: TObject);
begin
if DateTimePicker2.Time=Now then ShowMessage('Ok');
end;
Die if Abfrage funktioniert komischerweise nicht, verstehe nicht wieso, ist doch alles richtig geschrieben. :wall: Timer.Interval :=1 sek. Wer weiß da weiter? Danke!

Gausi 19. Okt 2009 12:18

Re: Komme nicht weiter mit Zeitvergleichen?
 
Der Wert von Now ist genauer als der Wert, den du angibst. 15.42 Uhr ist halt nicht derselbe Zeitpunkt wie 15.42 Uhr, 13 Sekunden und 123 Millisekunden.

Außerdem: TDatetime ist ein Float-Typ - die sollte man generell nicht auf Gleichheit überprüfen.

AlexII 19. Okt 2009 12:22

Re: Komme nicht weiter mit Zeitvergleichen?
 
Also
Delphi-Quellcode:
DateTimePicker2.Time
zeigt auch Sekunden an.... hm... und Timer vergleicht auch Millisekunden :gruebel: ah..jah...
Wie vergleicht man dann am besten eine Uhrzeit? Auch so, dass es auf Fremdsprachwindows läuft. :gruebel:

Sir Rufo 19. Okt 2009 12:24

Re: Komme nicht weiter mit Zeitvergleichen?
 
Und wenn man etwas nicht versteht, dann gibt man sich die Werte mal in einer Memo aus und schaut, ob der Vergleich wirklich passen könnte
Delphi-Quellcode:
procedure TForm4.Timer1Timer(Sender: TObject);
var
  Vergleich : TDateTime;
begin
  Vergleich := now; // Merken, weil now ja weiter läuft!!!
  Memo1.Lines.Add( Format( 'DateTimePicker: %s Now: %s', [ FloatToStr( DateTimePicker2.Time ), FloatToStr( Vergleich ) ] );
  if ( DateTimePicker2.Time = Vergleich ) then ShowMessage('Ok');
end;

Sharky 19. Okt 2009 12:24

Re: Komme nicht weiter mit Zeitvergleichen?
 
Zitat:

Zitat von AlexII
... Wie vergleicht man dann am besten eine Uhrzeit? ...

In diesem Fall einfach mit >= vergleichen.

Luckie 19. Okt 2009 12:25

Re: Komme nicht weiter mit Zeitvergleichen?
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von AlexII
... Wie vergleicht man dann am besten eine Uhrzeit? ...

In diesem Fall einfach mit >= vergleichen.

Plus einem Deltawert, sonst stimmt der Vergleich 23 Stunden und 59 Minuten. ;)

AlexII 19. Okt 2009 12:33

Re: Komme nicht weiter mit Zeitvergleichen?
 
Zitat:

Zitat von Sir Rufo
Und wenn man etwas nicht versteht, dann gibt man sich die Werte mal in einer Memo aus und schaut, ob der Vergleich wirklich passen könnte
Delphi-Quellcode:
procedure TForm4.Timer1Timer(Sender: TObject);
var
  Vergleich : TDateTime;
begin
  Vergleich := now; // Merken, weil now ja weiter läuft!!!
  Memo1.Lines.Add( Format( 'DateTimePicker: %s Now: %s', [ FloatToStr( DateTimePicker2.Time ), FloatToStr( Vergleich ) ] );
  if ( DateTimePicker2.Time = Vergleich ) then ShowMessage('Ok');
end;

Now muss ja auch weiterlaufen, DateTimePicker2.Time bleibt konstant eingestellt und vergleichen tust du genauso wie ich, was genauso nicht funktioniert. :pale:

TheFrog 19. Okt 2009 12:41

Re: Komme nicht weiter mit Zeitvergleichen?
 
Vielleicht kommst Du ja mit der Delphi-Procedure DecodeTime() weiter. Diese zerlegt Dir den Zeitwert in Stunden, Minuten, ..., welche Du dann vergleichen kannst.

Hans.

Sir Rufo 19. Okt 2009 12:44

Re: Komme nicht weiter mit Zeitvergleichen?
 
Zitat:

Zitat von AlexII
Zitat:

Zitat von Sir Rufo
Und wenn man etwas nicht versteht, dann gibt man sich die Werte mal in einer Memo aus und schaut, ob der Vergleich wirklich passen könnte
Delphi-Quellcode:
procedure TForm4.Timer1Timer(Sender: TObject);
var
  Vergleich : TDateTime;
begin
  Vergleich := now; // Merken, weil now ja weiter läuft!!!
  Memo1.Lines.Add( Format( 'DateTimePicker: %s Now: %s', [ FloatToStr( DateTimePicker2.Time ), FloatToStr( Vergleich ) ] );
  if ( DateTimePicker2.Time = Vergleich ) then ShowMessage('Ok');
end;

Now muss ja auch weiterlaufen, DateTimePicker2.Time bleibt konstant eingestellt und vergleichen tust du genauso wie ich, was genauso nicht funktioniert. :pale:

Du sollst Dir ja auch die Werte !!ansehen!! und dann wirst du !!sehen!! warum das nicht funktioniert!!!
Und der Wert von Now wird sich deshalb gemerkt, damit auch das ausgegeben wird, was danach dann auch verglichen wird!

Sherlock 19. Okt 2009 12:47

Re: Komme nicht weiter mit Zeitvergleichen?
 
OK, weils keiner wirklich erklärt hat, versuch ich mich mal daran:

Wissenswerte Voraussetzungen:
  • Ein DateTime erfasst auch Millisekunden.
  • Now ist natürlich auch auf die Millisekunde genau.
  • Der Timer ist nicht Millisekunden genau, da windows keine Echtzeitsystem ist.

Wenn Du also (millisekunden-)genaue Gleichheit prüfen möchtest ist es extrem wahrscheinlich, daß Du nicht die korrekte Millisekunde erwischst. Deshalb soltlest Du vielleicht nur Sekunden- oder Minutengenau prüfen. Wie Du das anstellst überlass ich mal Deiner Phantasie.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.
Seite 1 von 4  1 23     Letzte »    

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