Moin!
Nunja, Beratungsresistenz ist halt eine Anfänger-Krankheit...

Egal, dann halt für die Nachwelt die Musterlösung:
Zunächstmal machen wir uns einen Plan, wann welche Lampe leuchten soll:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| R1 Y1 G1 R2 Y2 G2 Dauer Phase 0 X X 1 Phase 1 X X X 1 Phase 2 X X 15 Phase 3 X X 1 Phase 4 X X 1 Phase 5 X X X 1 Phase 6 X X 10 Phase 7 X X 1 |
Hier steht Y für Gelb, sonst kann man das ja nicht auseinanderhalten.
Dann legen wir ein Demo-Projekt an:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TForm1 = class(TForm) imAmpelRot1: TImage; imAmpelGelb1: TImage; imAmpelGruen1: TImage; imAmpelRot2: TImage; imAmpelGelb2: TImage; imAmpelGruen2: TImage; Timer1: TTimer; private FPhase: Integer; FTakt: Integer; |
Wie man sieht, werden 6 Images gebraucht, anlegen und passend benennen, so dass das zwei Ampeln ergibt. Die beiden Klassen-Eigenschaften brauchen wir, um uns die aktuelle Phase und den Takt innerhalb der Phase zu merken.
Hier jetzt der Kern der Sache, der Timer-Ereignishandler:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Timer1Timer(Sender: TObject); const TaktSoll: array[0..7] of Integer = ( 1, 1, 15, 1, 1, 1, 10, 1 ); begin Inc(FTakt); if (FTakt = TaktSoll[FPhase]) then begin FPhase := (FPhase +1) mod 8; FTakt := 0; imAmpelRot1.Visible := FPhase in [0, 1, 4, 5, 6, 7]; imAmpelGelb1.Visible := FPhase in [1, 3]; imAmpelGruen1.Visible := FPhase in [2]; imAmpelRot2.Visible := FPhase in [0, 1, 2, 3, 4, 5]; imAmpelGelb2.Visible := FPhase in [5, 7]; imAmpelGruen2.Visible := FPhase in [6]; end; |
Wir zählen in FTakt die Anzahl Timer-Ereignisse. Wenn die Anzahl der Vorgabe für diese Phase entspricht, dann wird zur nächsten Phase geschaltet. Beim Phasenübergang ist dann die Sichtbarkeit der Lampen anzupassen. Dazu liest man die Tabelle einfach Spaltenweise für die entsprechende Lampe ab.
Und noch etwas Kosmetik für die Initialisierung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.FormCreate(Sender: TObject);
procedure SetColor(AImage: TImage; const AColor: TColor; const AVisible: Boolean = TRUE); begin AImage.Picture.Bitmap.Canvas.Brush.Color := AColor; AImage.Picture.Bitmap.Width := AImage.Width; AImage.Picture.Bitmap.Height := AImage.Height; AImage.Picture.Bitmap.Canvas.Rectangle(AImage.Canvas.ClipRect); AImage.Visible := AVisible; end;
begin SetColor(imAmpelRot1, clRed); SetColor(imAmpelRot2, clRed); SetColor(imAmpelGelb1, clYellow, FALSE); SetColor(imAmpelGelb2, clYellow, FALSE); SetColor(imAmpelGruen1, clLime, FALSE); SetColor(imAmpelGruen2, clLime, FALSE); |
Bei Fragen - fragen!
cu
Narses
There are 10 types of people - those who understand binary and those who don´t.