unit USvetofor; interface uses Forms, Classes, Graphics, ExtCtrls; type svColor = (Red = clRed, Yelow = clYellow, Green = clGreen); TSvetofor = class private FTimer: TTimer; FColor: svColor; FLastColor: svColor; FEnabled: Boolean; FOnChange: TNotifyEvent; procedure SetColor(const Value: svColor); procedure SetEnabled(const Value: Boolean); procedure OnTimer(Sender: TObject); protected procedure DoChange(Sender: TObject); public constructor Create; destructor Destroy; override; property Color: svColor read FColor write SetColor; property Enabled: Boolean read FEnabled write SetEnabled; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; implementation uses SysUtils; { Svetofor } constructor TSvetofor.Create; begin inherited; FTimer := TTimer.Create(Application); FTimer.Interval := 3000; //тут у нормальных светофоров обычно ставят от минуты и больше FTimer.Enabled := False; FTimer.OnTimer := OnTimer; end; destructor TSvetofor.Destroy; begin Enabled := False; FreeAndNil(FTimer); inherited; end; procedure TSvetofor.DoChange(Sender: TObject); begin if Assigned(FOnChange) then FOnChange(self); end; procedure TSvetofor.OnTimer(Sender: TObject); begin if (Color = Red) or (Color = Green) then Color := Yelow else begin if FLastColor = Red then Color := Green else Color := Red; end; end; procedure TSvetofor.SetColor(const Value: svColor); begin FLastColor := FColor; FColor := Value; DoChange(Self); end; procedure TSvetofor.SetEnabled(const Value: Boolean); begin FEnabled := Value; FTimer.Enabled := Value; FColor := Red; DoChange(Self); end;
type TForm1 = class(TForm) {...} Shape1: TShape; {...} private {...} ExcelApp: OLEVariant; FSvetofor: TSvetofor; procedure SvetoforChange(Sender: TObject); {...} end; procedure TForm1.FormCreate(Sender: TObject); begin {...} FSvetofor := TSvetofor.Create; //создаем светофор FSvetofor.OnChange := SvetoforChange; //назначаем обработчик события end; procedure TForm1.FormShow(Sender: TObject); begin {...} FSvetofor.Enabled := True; //включаем светофор end; procedure TForm1.SvetoforChange(Sender: TObject); var cl: Integer; begin cl := Integer((Sender as TSvetofor).Color); Shape1.Brush.Color := TColor(cl); Shape1.Repaint; end;