Thema: Delphi Ampel programmieren

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Ampel programmieren

  Alt 4. Dez 2008, 14:11
Als ersters fällt auf, dass beim Timer-Aufruf zwar die Phase gewechselt wird, aber der Teil für die Anzeige wird nur durch Drücken von Button1 durchlaufen ...

Also hier fehlt eigentlich nur noch die vernünftige Aufspaltung der einzelnen Teile:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    Shape1: TShape;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SRot : TShape;
    SGelb : TShape;
    SGruen : TShape;
    Timer1 : TTimer;

    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
    FPhase: Integer;
    FZeit: Integer;
   
   procedure ZeichneAmpelBild;
   
   procedure SetPhase( Value : Integer );
   procedure SetZeit( Value : Integer );
  public
    { Public-Deklarationen }
   property Phase : Integer read FPhase write SetPhase;
   property Zeit : Integer read FZeit write SetZeit;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Phase := Phase + 1; // <--- hier wird automatisch SetPhase aufgerufen
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  FPhase := 1;
  FZeit := 1;
  ZeichneAmpelBild;
end;

{ Rr }

procedure TForm2.ZeichneAmpelBild;
begin
  case
   Phase
  of
    1: // Rote Ampel
     begin
        SRot.Brush.Color := clRed; // leuchtendes Rot
        SGelb.Brush.Color := clOlive; // dunkles Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
       end;
    2: // Rot-Gelbe Ampel
     begin
        SRot.Brush.Color := clRed; // leuchtendes Rot
        SGelb.Brush.Color := clYellow; // leuchtendes Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
      end;
    3: // Grüne Ampel
     begin
        SRot.Brush.Color := clMaroon; // dunkles Rot
        SGelb.Brush.Color := clOlive; // dunkles Gelb
        SGruen.Brush.Color := clLime; // leuchtendes Grün
      end;
    4: // Gelbe Ampel
     begin
        SRot.Brush.Color := clMaroon; // dunkles Rot
        SGelb.Brush.Color := clYellow; // leuchtendes Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
      end;
  end;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm2.SetPhase(Value: Integer);
begin
  if
    ( Value <> FPhase )
  then
    begin
      if
        ( Value > 4 ) or
       ( Value < 1 )
      then
        FPhase := 1
      else
        FPhase := Value;
      ZeichneAmpelBild;
   end;
end;

procedure TForm2.SetZeit(Value: Integer);
begin
  if
   ( Value > 12 ) or
   ( Value < 1 )
  then
    FZeit := 1
  else
    FZeit := Value;
   
  case
    FZeit
  of
    1..5 :
     Phase := 1; // <--- hier wird automatisch SetPhase aufgerufen
    6 :
     Phase := 2; // <--- hier wird automatisch SetPhase aufgerufen
    7..11:
     Phase := 3; // <--- hier wird automatisch SetPhase aufgerufen
    12 :
      Phase := 4; // <--- hier wird automatisch SetPhase aufgerufen
  end;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Zeit := Zeit + 1; // <--- hier wird automatisch SetZeit aufgerufen
end;

end.
Die Getter/Setter für Properties eigenen sich hier sehr schön, weil dadurch die Programmierung der Steuerung sehr simpel ausfällt

[der rote Kasten war da ... und ich wohl zu langsam ... aber hier eben mal mit Getter und Setter ... und umständlich keineswegs]

cu

Oliver

[edit] es fehlt natürlich noch das ein und ausschalten des timers [/edit]
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat