Für viele Schachuhren braucht man eigentlich nur einen Timer.
Dieser Timer ist nur dafür zuständig alle 0,2s die Anzeige sämlicher Schachuhren zu aktualisieren.
Eine einzelne Schachuhr könnte z.B. so aussehen:
Delphi-Quellcode:
TChessClock = class(TObject)
private
FLastStart : TDateTime;
FSummeZeit : TDateTime; // 1.0 entspricht einem Tag, 0.04166= eine Stunde
FRunning : Boolean;
public
procedure Start;
procedure Stop;
procedure Reset;
function GetSummezeit:TDateTime; // liefert die aufgelaufene Zeit
function GetSummeZeitAsString:string;
property Running : Boolean read FRunning;
end;
...
function TChessClock.GetSummezeit:TDateTime;
begin
if Running then
result := FSummeZeit + (Now-FLastStart)
else
result := FSummeZeit;
end;
Zu Beginn ist SummeZeit = 0. Wird die Uhr gestartet, dann wird die aktuelle Uhrzeit+Datum (Funktion Now benützen) im Feld FLastStart gespeichert.
Wird die Uhr gestoppt, dann wird intern gerechnet:
FSummeZeit := FSummeZeit + (Now - FLastStart);
Man kann die Uhr auch so designen, dass mit einer Zeitvorgabe (z.B. 10Min) gestartet wird und dann dieses Zeitguthaben verkleinert wird.
Für ein Schachspiel müssen zwei Uhren zusammengenommen werden.
Hier würde ich eine weitere Klasse verwenden, um zwei Objekte von TChessClock zusammenzufassen.
Beim Stop der einen Uhr startet wird automatisch die Uhr des Gegners gestartet.
Dann kann man beliebig viele Objekte dieser Doppeluhren in einer TObjectList oder in einem dyn. Array anlegen.
Der Timer hat dann "nur" noch die Aufgabe, alle Doppeluhren aus der Liste auszulesen und im Formular anzuzeigen.