Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Datum Timer Mitternacht (CheckNewDay) (https://www.delphipraxis.net/188542-datum-timer-mitternacht-checknewday.html)

FarAndBeyond 14. Mär 2016 16:56

Datum Timer Mitternacht (CheckNewDay)
 
Mit Hilfe eines TLabels lasse ich mir Tag, Datum und KW anzeigen (An dieser Stelle vielen Dank an den Mathematiker, ich habe deine KW Function gefunden und verbaut).
Wie kann man genau prüfen, ob es Mitternacht ist um dieses Label zu aktualisieren ?

Im Moment vergleiche ich zwei Strings:
(kein MultimediaTimer oder QueuedTimer... ist der ganz einfache Timer, Intervall: 1000)
Delphi-Quellcode:
Procedure TwndToDO.timerTIMETimer(Sender: TObject);
  Var
   CheckNewDay: String;
 Begin
  Try
   labTime.Caption  := TimeToStr(Now)+' ';
   labTime_Sh.Caption:= labTime.Caption;

   Inc(Counter);
    If Counter = 20
    Then
     Begin
      Counter:= 0;
      CheckNewDay:= FormatDateTime('hh:mm',Now);
       If CheckNewDay = '00:00'
       Then
        Begin
         labDate.Caption:= // gekürzt, viel zu lang...
         labDate_Sh.Caption:= labDate.Caption;
        End;
     End;
  Except
   On E: Exception
   Do ErrorLog('TimerTIME Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
 End;

nahpets 14. Mär 2016 18:38

AW: Datum Timer Mitternacht (CheckNewDay)
 
Versuchs mal damit:
Delphi-Quellcode:
const
  iOneSecond     : Integer =    1000; // eine Sekunde in Millisekunden
  iOneMinute     : Integer =   60000; // eine Minute in Millisekunden
  iFiveMinutes   : Integer =  300000; // Fünf Minuten in Millisekunden
  iFifteenMinutes : Integer =  900000; // Fünfzehn Minuten in Millisekunden
  iOneHour       : Integer = 3600000; // Eine Stunde in Millisekunden
  iOneDay        : Integer = 86400000; // Ein Tag in Millisekunden

function TSpecialTimer.CalcTimerInterval(iTimerInterval : Integer) : Integer;
Var
          dNow : Double;
begin
  // Interval setzen
  // Tagesdatum und Uhrzeit holen
  dNow := Now;
  // Den Tagesanteil holen (= Nachkommastellen).
  dNow := dNow - Trunc(dNow);
  // Rest bis Mitternacht holen.
  dNow := 1 - dNow;
  // Nachkommastellen mal Millisekunden pro Tag
  Result := Trunc(dNow * iOneDay);
  // wir benötigen den Rest bis zum angegeben Interval, damit der Timer
  // zur nächsten Minute, Stunde, 0 Uhr ... aktiv wird.
  Result := (Result mod iTimerInterval);
end;
Im Programm in etwa so verwenden:
Delphi-Quellcode:
Procedure TwndToDO.timerTIMETimer(Sender: TObject);
Var
   CheckNewDay: String;
Begin
  Try
    timerTIME.Enabled := False;
    labTime.Caption  := TimeToStr(Now)+' ';
    labTime_Sh.Caption:= labTime.Caption;
    labDate.Caption:= // gekürzt, viel zu lang...
    labDate_Sh.Caption:= labDate.Caption;
    // CalcTimerInterval berechnet die "fehlenden" Millisekunden bis Mitternacht
    // und setzt das Interval entsprechend.
    // Der Timer wird also um Mitternacht ausgelöst.
    // Der Rundungsfehler liegt bei +/- einer Millisekunde.
    timerTIME.Interval := CalcTimerInterval(iOneDay);
    timerTIME.Enabled := True;
  Except
    On E: Exception
      Do ErrorLog('TimerTIME Failed'+#13#10+E.ClassName+#13#10+E.Message);
  End;
End;
Beim Programmstart (oder an geeigneter Stelle), damit das Timerereignis einmalig "händisch" ausgeführt wird.
Delphi-Quellcode:
...
  timerTIMETimer(Nil);
...
Dadurch müsste das Label dann die entsprechenden Werte erhalten und anschließend jeweils um Mitternacht aktuallisiert werden.

FarAndBeyond 14. Mär 2016 20:12

AW: Datum Timer Mitternacht (CheckNewDay)
 
@nahpets:

Danke für die Info...
Mir ist schon aufgefallen, dass mein erster Ansatz nicht zu gebrauchen ist, da er niemals zu 100% funzt.
Hatte gerade angefangen das komplett umzubauen und mal zu schauen ob der neue Ansatz besser ist...
Delphi-Quellcode:
Procedure TForm1.FormCreate(Sender: TObject);
 Begin
  labDate.Caption:= DateToStr(Now);
  timerTIME.Enabled:= True;
 End;

Procedure TForm1.timerTIMETimer(Sender: TObject);
  Var
   CheckNewDay: String;
 Begin
   // UpdateTIME
   CheckNewDay:= FormatDateTime('hh',Now);

    If CheckNewDay = '00'
    Then
     Begin
      If booDateUpdated
      Then Exit;

      labDate.Caption:= // Werte aktualisieren...
      booDateUpdated:= True;
     End
    Else booDateUpdated:= False;
 End;
Ich schau mir jetzt erstmal deinen Weg an...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.

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