Delphi-PRAXiS
Seite 2 von 4     12 34      

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 18:19

Re: Uhrzeiten vergleichen
 
@DeddyH
DAS IST SPITZE!!! GENAU WAS ISCH GESUCHT HABE!

@ himitsu
Deine Lösung funktionierte auch (damit will ich nur sagen, dass ich sie bei der Übernahme nicht verpfuscht habe), aber die Lösung von DeddyH verstehe ich besser. Ich werden mir aber Deine Erklärung noch sehr genau ansehen, um sie zu verstehen! Vielen Dank für die ausführlichen Informationen!

@Anonymos
Danke für den Hinweis, da hast Du sicherlich recht. Werde es berücksichtigen!



Danke :-D :cyclops:

Edit:

Was ist denn, wenn ich Minuten und Sekunden weglasse und den Timer auf eine Stunde einstelle?

himitsu 22. Jan 2009 18:22

Re: Uhrzeiten vergleichen
 
dann wird (z.B. wenn das TimerIntervall auf 1000 steht die Nachricht bis zu 3600 Mal pro Stunde angezeigt?

DeddyH 22. Jan 2009 18:23

Re: Uhrzeiten vergleichen
 
Dann muss man sich halt merken, ob das innerhalb der aktuellen Stunde bereits passiert ist.

himitsu 22. Jan 2009 18:34

Re: Uhrzeiten vergleichen
 
wenn es nicht ganz genau sein muß, dann geht auch sowas (falls ich mich nicht verrechnet hab)
Delphi-Quellcode:
// Timer1.Enabled per Default auf False

Procedure TForm1.Timer1Timer(Sender: TObject);
  Begin
    Timer.Enabled := False;
    Showmessage(TimeToStr(Now));
    Timer1.Intervall := 24*60*1000 - (Trunc(Now * 24*60*1000) - Trunc(Now * 24)*60*1000);
    Timer1.Enabled := True;
  End;

// Timer das erste Mal starten
Timer1.Intervall := 24*60*1000 - (Trunc(Now * 24*60*1000) - Trunc(Now * 24)*60*1000);
Timer1.Enabled := True;

ohne langsamen StrToTime und etwas langsameren DecodeTime
Delphi-Quellcode:
Var LastTime: Integer; // 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) >= 0.25{6:00}) and (Frac(Time) < 0.8{19:12})
        and (Trunc(Time * 24) > LastTime) Then Begin
      LastTime := Trunc(Time * 24);
      Showmessage(TimeToStr(Time));
    End;
  End;

// und nicht vergessen LastTime zu initalisieren
// LastTime := 0;
//
// ist es aber in Private von TForm1 deklariert,
// dann ist es automatisch schon initialisiert

hoika 22. Jan 2009 18:58

Re: Uhrzeiten vergleichen
 
Hallo,

DeddyH hat den richtigen Tip.
Merke dir einfach, das das Ereignis für eine bestimmte Stunde
schon gefeuert hatte in einer Liste.

Dann kannst du sogar sowas wie " + 2 Minuten ist auch noch OK" einbauen.


Heiko

Ykcim 23. Jan 2009 09:24

Re: Uhrzeiten vergleichen
 
Hallo Zusammen,

vielen Dank für die vielen guten Antworten!

Ich muss gestehen, dass ich die Berechnung der Zeiten nicht ganz verstehe - ich hatte noch nie damit zu tun...

Was haltet ihr denn davon:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var aHour,aMin,aSec,aMSec: Word;
begin
  Timer1.Interval:=3600000;
  Label1.Caption := TimeToStr(Time);
  DecodeTime(now,aHour,aMin,aSec,aMSec);
  if (aHour in [6..19]) and (aMin in [0..10]) then
  ShowMessage('Volle Stunde');
  if (aHour = 5) and (aMin in [0..10]) then   //Damit, wenn das Programm sehr lange
    begin                                     //läuft, ich nicht irgendwann durch
      Timer2.Enabled:=true;                   //sehr sehr viele Hänger aus dem
      Timer1.Enabled:=false;                  //10 Minutenfenster falle...
    end;
end;
Damit habe ich meinen Timerintervall auf 1h festgelegt (ich muss mir also nicht mehr merken, ob schon eine Aktualisierung in der aktuellen Stunde durchgeführt wurde), aber eventuelle Verzögerungen werden durch die Minutentoleranz wieder abgefangen.

Und damit das Programm nicht immer nur in den ersten 10 Minuten einer Stunde gestartet werden sollte, schicke ich das vorab:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var aHour,aMin,aSec,aMSec: Word;
begin
    Timer2.Interval:=1000;
    Label1.Caption := TimeToStr(Time);
    Timer1.Enabled:=false;
    DecodeTime(now,aHour,aMin,aSec,aMSec);
    if (aMin in [0..5]) then        //Wird ja nach dem ersten Durchlaufen der
      begin                         //IF-Schleife abgeschlatet...
        Timer1.Enabled:=true;
        Timer2.Enabled:=false;
        showmessage('Timer2 false');
      end;
end;
Wie ist eure Meinung dazu?

Danke

Ykcim 23. Jan 2009 09:27

Re: Uhrzeiten vergleichen
 
Hatte hier noch einmal alles gepostet, bevor ich den edit-Button gefunden hatte... :wall: :cheers:

Tango 17. Okt 2014 19:48

AW: Re: Uhrzeiten vergleichen
 
Zitat:

Zitat von himitsu (Beitrag 871824)
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;

Um das ganze zu verstehen habe ich mal eine Beispiel erstellt, leider bekomme ich immer falsches Wert :(

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
Var Time,LastTime: TDateTime;
begin
  If (Frac(Time) <= StrToTime('06:00:00')) and (Frac(Time) > StrToTime('14:00:00'))
        Then
        LastTime := now;
edit1.Text:= 'Frühschicht';
If (Frac(Time) <= StrToTime('14:00:01')) and (Frac(Time) > StrToTime('22:00:00'))
        Then
edit1.Text:= 'Spätschicht';
LastTime := Now ;
end;
end.

himitsu 17. Okt 2014 20:02

AW: Re: Uhrzeiten vergleichen
 
Zitat:

Zitat von Tango (Beitrag 1276460)
Delphi-Quellcode:
If (Frac(Time) <= StrToTime('06:00:00')) and (Frac(Time) > StrToTime('14:00:00'))

Kleiner-gleich 6 Uhr (vor 7 Uhr) UND größer/nach 14 Uhr

Delphi-Quellcode:
If (x <= 6) and (x > 14)
, bzw. umgestellt
Delphi-Quellcode:
If (6 >= x) and (x > 14)
(6 >= x > 14)
Lösung: Also entweder ODER oder du müsstest die Vergleichsoperatoren umdrehen.

PS: Schau auch mal in die neue DateUtils.
Delphi-Referenz durchsuchenTimeOf ist bestimmt verständlicher als Delphi-Referenz durchsuchenFrac und es gibt noch viele weitere praktische Funktionen dort, wie z.B. Delphi-Referenz durchsuchenTimeInRange.

Sir Rufo 17. Okt 2014 20:25

AW: Uhrzeiten vergleichen
 
Erst mal formatieren, dann schauen, dann denken
Delphi-Quellcode:
procedure*TForm1.Timer1Timer(Sender: TObject);
Var*
  Time, LastTime: TDateTime;
begin
**If*(Frac(Time) <= StrToTime('06:00:00'))*and*(Frac(Time) > StrToTime('14:00:00'))
**Then
****LastTime := now;

  edit1.Text:= 'Frühschicht';

  If*(Frac(Time) <= StrToTime('14:00:01'))*and*(Frac(Time) > StrToTime('22:00:00'))
**Then
    edit1.Text:= 'Spätschicht';

  LastTime := Now ;
end;

end.
Welchen Wert hat
Delphi-Quellcode:
Time
? - Irgendeinen, also ein Zufallsgenerator?
Wofür wird
Delphi-Quellcode:
LastTime
ein Wert zugeordnet? Für nix.

Ich würde es mal damit probieren
Delphi-Quellcode:
function GetShiftNameFromTime ( ATime : TTime ): string;
var
  LTime : TTime;
begin
  LTime := Frac ( ATime );
  if LTime < EncodeTime ( 6, 0, 0 )
  then
    Result := 'Nachtschicht'
  else if LTime < EncodeTime ( 14, 0, 0 )
  then
    Result := 'Frühschicht'
  else if LTime < EncodeTime ( 22, 0, 0 )
  then
    Result := 'Spätschicht'
  else
    Result := 'Nachtschicht';
end;
Verwenden dann so
Delphi-Quellcode:
procedure TForm1.Timer1Timer ( Sender : TObject );
begin
  Edit1.Text := GetShiftNameFromTime ( Now );
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 2 von 4     12 34      

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 by Thomas Breitkreuz