type
TAmpelStatus = (asAllesAus, asRot, asRotGelb, asGelb, asGruen, asGelbBlinkend);
TAmpelBasis =
class
procedure Umstellen(NeuerStatus: TAmpelStatus);
virtual;
abstract;
procedure ZeichneNeu;
virtual;
abstract;
end;
TAmpelRotGruen =
class(TAmpelBasis)
private
fBild: TCanvas;
fX, fY: Integer;
// die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
fGeraet: TIrgendwas;
// Schnittstelle zum Ausgabegerät;
fPortRot: Integer;
// die Adressen der entsprechenden LED
fPortGruen: Integer;
//
fStatus: TAmpelStatus;
public
constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
Geraet: TIrgendwas; PortRot, PortGruen: Integer);
procedure Umstellen(NeuerStatus: TAmpelStatus);
override;
procedure ZeichneNeu;
override;
end;
TAmpelRotGelbGruen =
class(TAmpelBasis)
private
fX, fY: Integer;
// die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
fPortRot: Integer;
// die Adressen der entsprechenden LED
fPortGelb: Integer;
//
fPortGruen: Integer;
//
fBlinkerAn: Boolean;
// einfach bei jedem Zeichnen umschalten und zusammen
fStatus: TAmpelStatus;
// mit asGelbBlinkend auf das Gelb anwenden
public
constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
Geraet: TIrgendwas; PortRot, PortGelb, PortGruen: Integer);
procedure Umstellen(NeuerStatus: TAmpelStatus);
override;
procedure ZeichneNeu;
override;
end;
constructor TAmpelRotGruen.Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
Geraet: TIrgendwas; PortRot, PortGruen: Integer);
begin
fBild := Zeichenflaeche;
fX := x;
fY := y;
fGeraet := Geraet;
fPortRot := PortRot;
fPortGruen := PortGruen;
fStatus := asAllesAus;
Zeichne;
end;
procedure TAmpelRotGruen.Umstellen(NeuerStatus: TAmpelStatus);
begin
fStatus := NeuerStatus;
case fStatus
of
asAllesAus:
begin
fGeraet.Aus(fPortRot);
fGeraet.Aus(fPortGruen);
end;
asRot:
begin
fGeraet.An(fPortRot);
fGeraet.Aus(fPortGruen);
end;
asGruen:
begin
fGeraet.Aus(fPortRot);
fGeraet.An(fPortGruen);
end;
else raise Exception.Create('
diesen Status gibt es hier nicht');
end;
Zeichne;
end;
procedure TAmpelRotGruen.Zeichne;
begin
ZeichneRahmenUndWasSonstNochBenötigtWird(fBild);
case fStatus
of
asRot: ZeichneRotesLicht(fBild);
asGruen: ZeichneGruenesLicht(fBild);
end;
end;
// Ampel erstellen
Liste.Add(TAmpelRotGruen.Erstelle(Canvas, 100, 50, Geraet, 1, 2));
// erste Ampel umstellen
Liste[0].Umstellen(asRot);
// alles neu zeichnen
for i := 0
to Liste.Count - 1
do
Liste[i].Zeichne;
// alles auf Grün stellen (bitte nicht nachmachen)
for i := 0
to Liste.Count - 1
do
Liste[i].Umstellen(asGruen);