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 Uhrzeiten vergleichen (https://www.delphipraxis.net/128008-uhrzeiten-vergleichen.html)

Ykcim 22. Jan 2009 15:44


Uhrzeiten vergleichen
 
Hallo,

ich habe eine wahrscheinlich simple Frage:

Ich möchte ein Programm schreiben, dass von 06:00Uhr bis 19:00Uhr immer zur vollen Stunde etwas ausführt. Ich wollte dazu den Timer verwenden und die aktuelle Zeit mit einer vorgegebenen Zeit(en) vergleichen.

Aber irgendwie klappt das nicht!

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var DateTime:TDateTime;

begin
   label1.Caption:=timetostr(now);
   If Now() = strtotime('16:40:50')then
   showmessage(timetostr(now));

end;
Kann mir da jemand helfen?

Danke

DeddyH 22. Jan 2009 15:49

Re: Uhrzeiten vergleichen
 
Ein TDateTime besteht aus dem Vorkommaanteil für das Datum und dem Nachkommaanteil für die Zeit. Um also nur Zeiten zu vergleichen, darfst Du nur den Nachkommaanteil betrachten (den bekommt man mit Frac()). Andere Möglichkeit: EncodeDate() und DecodeDate() und/oder die Funktionen aus der Unit DateUtils verwenden.

himitsu 22. Jan 2009 15:49

Re: Uhrzeiten vergleichen
 
Da du ja deinen Timer nicht im Millisekundenrythmus ausführen kannst, wirst du nicht geneu vergleichen lassen können.

nimm die nächste Zeit (nächste volle stunde) und prüf so
Delphi-Quellcode:
If Trunc(Now) >= strtotime('16:00:00') then
Ach ja, Now enthält auch noch die Tage(Monate,Jahre) ... die müßtest du erstmal rausrechnen.



[add]
ungetestet ... mal sehn, ob ich 'nen Denkfehler hab

(Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00'))
prüfen ob es ab 6°° und vor 20°° (also bis kurz nach 19°°) ist

Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24)
Zeiten in Stunden umrechnen und vergleichen

Delphi-Quellcode:
Var LastTime: TDateTime; // am Besten im Private-Abschnitt von TForm1 deklarieren

Procedure TForm1.Timer1Timer(Sender: TObject);
  Var Time: TDateTime;

  Begin
    Time := Now;
    Label1.Caption := TimeToStr(Time);
    If (Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00'))
        and (Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24)) Then Begin
      LastTime := Time;
      Showmessage(TimeToStr(Time));
    End;
  End;

// und nicht vergessen LastTime zu initalisieren
// LastTime := Now;

Ykcim 22. Jan 2009 16:39

Re: Uhrzeiten vergleichen
 
Hallo,

ersteinmal vielen Dank für die Antworten!!!

Ich muss aber mein Verständnis noch hinterfragen:

Delphi-Quellcode:
 If (Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00'))
Damit wird geprüft, es gerade zwischen 06:00 und kleiner 19:00 Uhr ist?


Delphi-Quellcode:
        and (Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24)) Then Begin
Damit wird geprüft, dass die aktuelle Uhrzeit größer ist als die bei der Aktion gespeicherten Uhrzeit?

Aber wo wird jede volle Stunde geprüft?

Danke im Voraus

Ykcim 22. Jan 2009 16:48

Re: Uhrzeiten vergleichen
 
Warum kann ich eigentlich nicht bei der aktuelle Uhrzeit nur die Stunden, Minuten und Sekunden vergleichen und die Milisekunden unberücksichtigt lassen, wenn mein Timer alle Sekunde läuft?

DeddyH 22. Jan 2009 16:57

Re: Uhrzeiten vergleichen
 
Versuch es mal so:
Delphi-Quellcode:
var aHour,aMin,aSec,aMSec: Word;
begin
  DecodeTime(now,aHour,aMin,aSec,aMSec);
  if (aHour in [6..19]) and (aMin = 0) and (aSec = 0) then
    ShowMessage('Volle Stunde');
end;

Anonymos 22. Jan 2009 17:03

Re: Uhrzeiten vergleichen
 
Des mit den Sekunden würd ich lieber weglassen, wenn er dann nähmlich wegen CPU-Verzögerungszeiten dese Sekunde "vergisst" stehste dumm da.

nun du kannst ja einfach prüfen, ob die neue Zeit in Stunden (min) >= die letzte Stunde ist.

Es ist jedoch nicht sinnvoll einen Timer jede Sekunde zu starten wenn er eigentlich nur jede Stunde arbeiten sollte. Da hat dein PC viel zu viel zu tun, ohne eigentlich was zu tun.

Stelle ihn doch lieber auf 30-45 min, un lass ihn sich dann selbst dynamisch auf den Zeitverbrauch reagieren, damit der dann genau zur Vollen Stunde seine Aktion ausführt

himitsu 22. Jan 2009 17:04

Re: Uhrzeiten vergleichen
 
warum das nicht geht?
laß mal dein Programm, bei DeddyH's Code für einen Sekündchen hängen ... schwußt, die x:00:00 würde übersprungen und es passiert nix

und bei Now = StrToTime('16:00:00') wird, wenn das nicht "fast" auf die Millisekunde genau um 16°° verglichen wird, auch nie was passieren.


bei "meinem" Code kannst du den Timer auch locker im Minuten-Interval laufen lassen,
aber selbst ein 1-Sekundenintervall würde nicht wirklich viele Systemresourcen verbrauchen.
bei DeddyH's Code sollte der Timer schon sicherheitshalber mehrmals pro Sekunde diesen Vergleich ausführen und selbs da ist es nicht sicher, daß das Ereignis ausgelöst wird (wie gesagt, da braucht nur der Rechner mal kurz etwas zu sehr ausgelastet sein)





Da du ja 19°° auch noch haben möchtest, wird also auf kleiner 20°° geprüft.

theoretisch würde es auch ausreichen, wenn z.B. etwa so geprüft würde:
Delphi-Quellcode:
If (Stunde >= '06:00:00') and (Stunde < '19:05:00')
aber ganze Zahlen sehen auch nett aus

Die Prüfung ob es Zeit zur Anzeige ist, erfollgt meißt kurz nach der vollen Stunde,
also könnte bei (Frac(Time) <= StrToTime('19:00:00')) das 19°°-Ereignis ausfallen

aber mir fällt grad was auf ... das Frac bei der Stundenprüfung macht kleine Probleme bei Tageswechsel, also wenn das Programm die Nacht durchläuft.
Delphi-Quellcode:
and (Trunc(Time * 24) > Trunc(LastTime * 24)) Then Begin
hier werden jeweils die Stunden vor das Komma (siehe Delphi-Referenz durchsuchenTDateTime) verschoben und dann verglichen
und sobald sich die errechnete Zahl(Zeit) ändert, wird die Nachricht angezeigt.

(x = Anzahl der Tage seit 30.12.1899)
12:00 = x.5 ... x.5 * 24 = 12.0
6:00 = x.25 ... x.25 * 24 = 6.0
6:12 = x.2583 ... x.2583 * 24 = 6.2 ... Trunc(6.2) = 6

DeddyH 22. Jan 2009 17:11

Re: Uhrzeiten vergleichen
 
Die Sekunden hatte ich erst draußen, aber ich weiß ja nicht, wie genau das nun werden soll.

himitsu 22. Jan 2009 17:15

Re: Uhrzeiten vergleichen
 
OK, dann laß mal die Sekunden weg, aber was glaubst du denn, was dann passiert?

ja richtig: die Nachricht wird mehrmals angezeigt
OK, der Timer auf 1 Minute , da kommt dann die Nachricht maximal einmal an, oder auch garnicht :stupid:

So oder so, das Intervall muß (bei deinem Code) kürzer sein, als seine Vergleichtdistanz und es immer muß das letze Ereignis gespeichert und beachtet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 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