Poniżej jest przedstawiony ABSOLUTNIE CAŁY kod z dowolną logiką, wystarczy wypełnić tabelkę:
var Sem:array[0..7]of record R,Y,G:TShape; end; // to ma być w klasie
const Tb:array[0..7]of record time:Integer; Sem:array[0..7]of record R,Y,G:Boolean; end; end= // całość logiki masz w tej tablice - trzeba z głową wytpełnić
(
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false))),
(time:2000;Sem:((R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false),(R:false;Y:false;G:true),(R:true;Y:false;G:false),(R:false;Y:true;G:false)))
);
procedure TForm1.FormCreate(Sender: TObject);
begin
Sem[0].R:=Czerwone1;
Sem[0].Y:=Zolte1;
Sem[0].G:=Zielone1;
Sem[1].R:=Czerwone2;
Sem[1].Y:=Zolte2;
Sem[1].G:=Zielone2;
... // reszta tak samo, można też w pętli przez findcomponent
Sem[7].R:=Czerwone8;
Sem[7].Y:=Zolte8;
Sem[7].G:=Zielone8;
Timer.Tag:=0;
Timer.Interval:=50;
Timer.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var T,I:Integer;
begin
T:=Timer.Tag;
T.Interval:=Tb[T].Time;
for I:=0 to 7 do
begin
if Tb[T].Sem[I].R then Sem[I].R.Brush.Color:=clRed else Sem[I].R.Brush.Color:=clSilver;
if Tb[T].Sem[I].Y then Sem[I].Y.Brush.Color:=clYellow else Sem[I].Y.Brush.Color:=clSilver;
if Tb[T].Sem[I].G then Sem[I].G.Brush.Color:=clLime else Sem[I].G.Brush.Color:=clSilver;
end;
Timer.Tag:=(T+1)and(7); // można (T+1)mod(8);
end;