Thema: Delphi Timer und Laufzeit

Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Timer und Laufzeit

  Alt 22. Mai 2010, 01:28
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;
  Mit Zitat antworten Zitat