![]() |
Ampelschaltung mit Case Anweisungen.
Hallo :hi:
ich muss für die Schule eine Ampelschaltung machen. Mit einem Timer und Case anweisungen.
Delphi-Quellcode:
Irgentetwas hab ich falsch gemacht, jedoch weis ich nicht was.
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. Wäre super wenn ihr mir nen Tipp geben könntet. |
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.ä. |
Re: Ampelschaltung mit Case Anweisungen.
Ich wuerde erst mal den Ansatz ueberarbeiten. Eine Ampel ist ein Zustandsautomat.
Delphi-Quellcode:
Durch diese Zustaende rotiert die Ampel einfach.
type
TAmpelZustaende = (azRot, azRotGelb, azGruen, azGelb);
Delphi-Quellcode:
Jetzt kann man vom Zustand die Darstellung ableiten.
procedure TForm1.TAmpelTimer(Sender: TObject);
begin // den Zustand fortschalten if AmpelZustand = azGelb then AmpelZustand := azRot else Inc(AmpelZustand);
Delphi-Quellcode:
Das wichtigste dabei ist das immer die Darstellung dem Zustand des Programmes nachgeordnet ist. Das gilt fuer jedes vernuenftige Programm.
// 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; |
Re: Ampelschaltung mit Case Anweisungen.
wow super!!
Danke für die schnelle Antworten !!! :coder: |
Re: Ampelschaltung mit Case Anweisungen.
Alternative Zustandsfortschaltung. Es wird ausgenutzt das TAmpelZustand ein Ordinaltyp ist und daher mit Zahlen gerechnet werden kann.
Delphi-Quellcode:
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.
procedure TForm1.TAmpelTimer(Sender: TObject);
begin // den Zustand fortschalten AmpelZustand := TAmpelZustand((Ord(AmpelZustand) + 1) mod (High(AmpelZustand) + 1)); Das duerfte aber den Lehrer misstrauisch machen. Kein Anfaenger kann das aus dem Aermel schuetteln. :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz