Zitat von
Privateer3000:
Was muss in der Timerprozedur ablaufen? Ich habe einfach keine Idee, wie das aussehen soll.
Ich habe jedem Label (Zeit) einen eindeutigen Tag zugwiesen, soll die die Tags
in ein Array stopfen, oder die Labels in eine Objektliste?
Wie man das macht ist auch ein bisschen Geschmackssache.
Aber ich würde hier zu "höherwertigen" Datenstrukturen wie Objektlisten greifen und (dynamische) Arrays mehr "in der Tiefe", also verborgen in Klassen, verwenden.
Aber Dir fehlt im Grunde genommen noch eine Klasse.
Diese Klasse dient als Adapter zwischen der Doppeluhr und den Controls der Benutzeroberfläche.
Es sieht erstmal nach mehr Arbeit aus, aber dafür vereinfacht sich der Code im Formular.
Hier mal ganz grob diese Klasse:
Delphi-Quellcode:
TGameClockAdapter=class(TObject)
public
GameClock : TGameClock; // die Doppeluhr
LabelPlayerA : TLabel; // Zeitanzeige Spieler A
LabelPlayerB : TLabel; // Zeitanzeige Spieler B
LabelStatus : TLabel; // Anzeige, welcher Spieler am Zug ist
destructor Destroy;override;
procedure RefreshUserInterface;
procedure StartNewGame;
procedure PauseGame;
...
end;
...
procedure TGameClockAdapter.RefreshUserInterface;
begin
LabelPlayerA.Caption := GameClock.PlayerA.GetSummeZeitAsString;
LabelPlayerB.Caption := GameClock.PlayerB.GetSummeZeitAsString;
if GameClock.PlayerA.Running then
LabelStatus.Caption := 'Spieler A am Zug'
else
LabelStatus.Caption := 'Spieler B am Zug'
end;
destructor TGameClockAdapter.Destroy;
begin
GameClock.Free;
inherited;
end;
Das mit dem Status-Label kann man natürlich auch schöner machen; z.B. Namen des Spielers anzeigen und zusätzlich mit zwei Icons anzeigen, welcher Spieler am Zug ist.
Der Ablauf sieht so aus:
Objekte von TGameClockAdapter erzeugen, jeweils ein GameClock-Objekt erzeugen und dem TGameClockAdapter-Objekt mitgeben.
Dann die 3 Labels zuweisen.
Diese TGameClockAdapter Objekte werden nun in einer Objektliste gespeichert.
Und dann noch der Eventhandler für den Timer:
Delphi-Quellcode:
procedure TForm1.TimerAllTimer(Sender:TObject)
var
i : integer;
begin
// Azeige für alle Doppeluhren aktualisieren
for i := 0 to FGameClockList.Count-1 do
begin
(FGameClockList.Objects[i] as TGameClockAdapter).RefreshUserInterface;
end;
end;