Ich weiß nicht wie genau du es brauchst. Ist die Regelmäßigkeit wichtig? Dann ist ein Timer (bzw.
GetTickCount()
) nicht grade die beste Wahl, denn das ist, glaube ich, nur auf eine 64stel-Sekunde genau. Daher würde ich auch auf den Interval des Timers aufpassen, sodass es am besten glatt aufgeht.
Oder ist dir die Erfassung der genauen Zeitspanne wichtig? Dann würde ich nicht mit TDateTime arbeiten, da treten ja schon Rundungsfehler bei Millisekunden auf. Für die Erfassung eines Zeitbereichs gibt es TTimeSpan, da kannst du bequem bis auf Ticks heruntergehen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
tickCount: DWORD;
ticksPassed: Int64;
begin
tickCount :=
WinApi.Windows.GetTickCount();
ticksPassed := (tickCount - lastTickCount) * TTimeSpan.TicksPerMillisecond;
timePassed := timePassed.Add( TTimeSpan.Create(ticksPassed) );
Caption :=
String.Format(
'
Time passed: %.2d:%.2d:%.2d (%d ms, %d ticks)', [
timePassed.Hours,
timePassed.Minutes,
timePassed.Seconds,
timePassed.MilliSeconds,
timePassed.Ticks
]);
lastTickCount := tickCount;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
timePassed := TTimeSpan.Zero;
lastTickCount :=
Winapi.Windows.GetTickCount();
end;
Da sieht man auch ganz gut wie es mit einem Timer-Intervall von 750ms immer glautt aufgeht, mit 700 allerdings krumm wird. Kurz nachrechnen, eine 64stel-Sekunde sind 15,625 ms, jepp, geht bei 750 glatt auf, bei 700 nicht.