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.