Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ampelschaltung mit Case Anweisungen. (https://www.delphipraxis.net/85276-ampelschaltung-mit-case-anweisungen.html)

VitaminC07 28. Jan 2007 13:58


Ampelschaltung mit Case Anweisungen.
 
Hallo :hi:

ich muss für die Schule eine Ampelschaltung machen. Mit einem Timer und Case anweisungen.
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    IAmpel4gelb: TImage;
    IAmpel4gruen: TImage;
    IAmpel4rot: TImage;
    IAmpel4rotgelb: TImage;
    IAmpel1gelb: TImage;
    IAmpel1gruen: TImage;
    IAmpel1rot: TImage;
    IAmpel1rotgelb: TImage;
    IAmpel3gelb: TImage;
    IAmpel3gruen: TImage;
    IAmpel3rot: TImage;
    IAmpel3rotgelb: TImage;
    IAmpel2gelb: TImage;
    IAmpel2gruen: TImage;
    IAmpel2rot: TImage;
    IAmpel2rotgelb: TImage;
    Label1: TLabel;
    Label2: TLabel;
    TAmpel: TTimer;
    BAmpelblinken: TButton;
    BAmpelaus: TButton;
    procedure TAmpelTimer(Sender: TObject);
  private
    { Private declarations }
    a:integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TAmpelTimer(Sender: TObject);
begin
a:=a+1;
case a of

1: begin
        IAmpel1rot.Visible :=true;
        IAmpel1rotgelb.Visible :=false;
        IAmpel1gelb.Visible :=false;
        IAmpel1gruen.Visible :=false;
        IAmpel2rot.Visible :=true;
        IAmpel2rotgelb.Visible :=false;
        IAmpel2gelb.Visible :=false;
        IAmpel2gruen.Visible :=false;
        IAmpel3rot.Visible :=true;
        IAmpel3rotgelb.Visible :=false;
        IAmpel3gelb.Visible :=false;
        IAmpel3gruen.Visible :=false;
        IAmpel4rot.Visible :=true;
        IAmpel4rotgelb.Visible :=false;
        IAmpel4gelb.Visible :=false;
        IAmpel4gruen.Visible :=false;
        IAmpel.Interval := 1000;
        end;
2: begin
        IAmpel1rot.Visible :=false;
        IAmpel1rotgelb.Visible :=true;
        IAmpel1gelb.Visible :=false;
        IAmpel1gruen.Visible :=false;
        IAmpel2rot.Visible :=true;
        IAmpel2rotgelb.Visible :=false;
        IAmpel2gelb.Visible :=false;
        IAmpel2gruen.Visible :=false;
        IAmpel3rot.Visible :=false;
        IAmpel3rotgelb.Visible :=true;
        IAmpel3gelb.Visible :=false;
        IAmpel3gruen.Visible :=false;
        IAmpel4rot.Visible :=true;
        IAmpel4rotgelb.Visible :=false;
        IAmpel4gelb.Visible :=false;
        IAmpel4gruen.Visible :=false;
        TAmpel.Interval := 1000
        end;
3: begin
        IAmpel1rot.Visible :=false;
        IAmpel1rotgelb.Visible :=false;
        IAmpel1gelb.Visible :=false;
        IAmpel1gruen.Visible :=true;
        IAmpel2rot.Visible :=true;
        IAmpel2rotgelb.Visible :=false;
        IAmpel2gelb.Visible :=false;
        IAmpel2gruen.Visible :=false;
        IAmpel3rot.Visible :=false;
        IAmpel3rotgelb.Visible :=false;
        IAmpel3gelb.Visible :=false;
        IAmpel3gruen.Visible :=true;
        IAmpel4rot.Visible :=true;
        IAmpel4rotgelb.Visible :=false;
        IAmpel4gelb.Visible :=false;
        IAmpel4gruen.Visible :=false;
        TAmpel.Interval := 10000
        end;
4: begin
        IAmpel1rot.Visible :=false;
        IAmpel1rotgelb.Visible :=false;
        IAmpel1gelb.Visible :=true;
        IAmpel1gruen.Visible :=false;
        IAmpel2rot.Visible :=true;
        IAmpel2rotgelb.Visible :=false;
        IAmpel2gelb.Visible :=false;
        IAmpel2gruen.Visible :=false;
        IAmpel3rot.Visible :=false;
        IAmpel3rotgelb.Visible :=false;
        IAmpel3gelb.Visible :=true;
        IAmpel3gruen.Visible :=false;
        IAmpel4rot.Visible :=true;
        IAmpel4rotgelb.Visible :=false;
        IAmpel4gelb.Visible :=false;
        IAmpel4gruen.Visible :=false;
        TAmpel.Interval := 1000
        end;
5: begin
        IAmpel1rot.Visible :=true;
        IAmpel1rotgelb.Visible :=false;
        IAmpel1gelb.Visible :=false;
        IAmpel1gruen.Visible :=false;
        IAmpel2rot.Visible :=true;
        IAmpel2rotgelb.Visible :=false;
        IAmpel2gelb.Visible :=false;
        IAmpel2gruen.Visible :=false;
        IAmpel3rot.Visible :=true;
        IAmpel3rotgelb.Visible :=false;
        IAmpel3gelb.Visible :=false;
        IAmpel3gruen.Visible :=false;
        IAmpel4rot.Visible :=true;
        IAmpel4rotgelb.Visible :=false;
        IAmpel4gelb.Visible :=false;
        IAmpel4gruen.Visible :=false;
        TAmpel.Interval := 1000
        end;


end;

end.
Irgentetwas hab ich falsch gemacht, jedoch weis ich nicht was.
Wäre super wenn ihr mir nen Tipp geben könntet.

imp 28. Jan 2007 14:16

Re: Ampelschaltung mit Case Anweisungen.
 
nach den ampelphasen hab ich jetzt nicht geschaut, aber aufgefallen ist mir, dass a nicht mehr zurückgesetzt wird.
eventuell wäre a := (a + 1) mod 5 oder so angebracht.

/edit: ach so, die variable sollte man auch irgendwo initialisieren. eventuell im constructor o.ä.

Robert Marquardt 28. Jan 2007 14:29

Re: Ampelschaltung mit Case Anweisungen.
 
Ich wuerde erst mal den Ansatz ueberarbeiten. Eine Ampel ist ein Zustandsautomat.
Delphi-Quellcode:
type
  TAmpelZustaende =
    (azRot, azRotGelb, azGruen, azGelb);
Durch diese Zustaende rotiert die Ampel einfach.
Delphi-Quellcode:
procedure TForm1.TAmpelTimer(Sender: TObject);
begin
  // den Zustand fortschalten
  if AmpelZustand = azGelb then
    AmpelZustand := azRot
  else
    Inc(AmpelZustand);
Jetzt kann man vom Zustand die Darstellung ableiten.
Delphi-Quellcode:
  // den neuen Zustand darstellen
  case AmpelZustand of
    azRot:
      begin
        IRot.Visible := True;
        IGelb.Visible := False;
        IGruen.Visible := False;
      end;
    azRotGelb:
      begin
        IRot.Visible := True;
        IGelb.Visible := True;
        IGruen.Visible := False;
      end;
    azGruen:
      begin
        IRot.Visible := False;
        IGelb.Visible := False;
        IGruen.Visible := True;
      end;
    azGelb:
      begin
        IRot.Visible := False;
        IGelb.Visible := True;
        IGruen.Visible := False;
      end;
  end;
Das wichtigste dabei ist das immer die Darstellung dem Zustand des Programmes nachgeordnet ist. Das gilt fuer jedes vernuenftige Programm.

VitaminC07 28. Jan 2007 14:38

Re: Ampelschaltung mit Case Anweisungen.
 
wow super!!
Danke für die schnelle Antworten !!!

:coder:

Robert Marquardt 28. Jan 2007 14:40

Re: Ampelschaltung mit Case Anweisungen.
 
Alternative Zustandsfortschaltung. Es wird ausgenutzt das TAmpelZustand ein Ordinaltyp ist und daher mit Zahlen gerechnet werden kann.
Delphi-Quellcode:
procedure TForm1.TAmpelTimer(Sender: TObject);
begin
  // den Zustand fortschalten
  AmpelZustand := TAmpelZustand((Ord(AmpelZustand) + 1) mod (High(AmpelZustand) + 1));
Erst wird mit Ord(AmpelZustand) der Zustand in eine Zahl umgewandelt und dann um 1 erhoeht. Das Resultat wird mit mod begrenzt (ein Ring der Zustaende wird geformt). Zuletzt wird das Ergebnis wieder in einen Ampelzustand verwandelt.
Das duerfte aber den Lehrer misstrauisch machen. Kein Anfaenger kann das aus dem Aermel schuetteln. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz