![]() |
||
| Zustandsbasierte Modellierung |
Material
Beispiele
Getränkeautomat
Pawlowscher Hund
|
|
|
einfache Ampelsteuerung |
zu Python-Realisierungen von Ampel-Automaten

Es wird die Unit uAmpel zum Zeichnen der Ampel benutzt. Die Steuerung löst über das Ereignis OnChange selbstständig den Aufruf von update auf.
....
procedure TForm1.update;
var
zustand : TZustand;
begin
zustand := steuerung.GetZustand;
case zustand of
q0 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,true,false,false);
q1 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,true,true,false);
q2 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,false,false,true);
q3 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,false,true,false);
end;
end;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
steuerung := TSteuerung.create;
steuerung.OnChange := update; // Ereignisbehandlung mit Ereignis verbinden
end;
....
Da die Steuerung einen Timer 'hat', ist sie für Erzeugung und Vernichtung verantwortlich. Das geschieht durch eine Erweiterung von Konstruktor und Destruktor. Bitte die Stellung des Schlüsselwortes 'inherited' beachten.
UNIT mTSteuerung;
interface
//-------------------- ggf Uses-Liste anpassen ! --------------------
uses
ExtCtrls;
type
TZustand = (q0,q1,q2,q3);
type
TEreignis = procedure of object;
TSteuerung = class
private //Attribute
timer : TTimer;
zustand : TZustand;
public
OnChange : TEreignis;
//Methoden
constructor create; virtual;
procedure neuerZustand(Sender : TObject);
procedure SetZustand (pZustand: TZustand);
function GetZustand : TZustand;
destructor destroy; virtual;
end;
implementation
const // Phasenlängen in ms
rotZeit = 2000;
rotgelbZeit = 500;
gruenZeit = 2000;
gelbZeit = 500;
//+---------------------------------------------------------------------
//| TSteuerung: Methodendefinition
//+---------------------------------------------------------------------
//-------- create (public) ---------------------------------------------
constructor TSteuerung.create;
begin
inherited create;
timer := TTimer.Create(nil);
zustand := q0;
timer.Interval := rotZeit;
timer.OnTimer := neuerZustand;
end;
//-------- neuerZustand (public) ---------------------------------------
procedure TSteuerung.neuerZustand(Sender : TObject);
begin
case zustand of
q0: begin zustand := q1; timer.Interval := rotgelbZeit; end;
q1: begin zustand := q2; timer.Interval := gruenZeit; end;
q2: begin zustand := q3; timer.Interval := gelbZeit; end;
q3: begin zustand := q0; timer.Interval := rotZeit; end;
end;
if Assigned(OnChange) then OnChange;
end;
//-------- SetZustand (public) -----------------------------------------
procedure TSteuerung.SetZustand (pZustand: TZustand);
begin
zustand := pZustand;
end;
//-------- GetZustand (public) -----------------------------------------
function TSteuerung.GetZustand : TZustand;
begin
result := zustand;
end;
//-------- destroy (public) --------------------------------------------
destructor TSteuerung.destroy;
begin
timer.Free;
inherited destroy;
end;
end.