![]() |
Ampel programmieren
Hi leute ich bin neu also nich zu streng mit mir.
Naja also ich hab hier schon die SuFu benutzt und der spuckt auch viel aus aber ich kann mit den ganzen sachen nichts anfangen ! Wir machen zurzeit in der Schule Programmierung mit Delphi und ich hänge da total hinterher da ich 1 Jahr weniger Erfahrung damit habe als der ganze Kurs. Ich muss selbst irgendwie zusehen wie ich da reinkomme, denn ich habe mit delhi vorher nun wirklich nichts gemacht. Nun haben wir eine Hausaufgabe aufbekommen und zwar sollen wir eine Ampel programmieren. Sie soll nach einem klick bei rot anfangen und dann einmal durchlaufen. Das Layout --> ![]() Könnt ihr mir das hier vielleicht in einigen Schritten erklären ? Ich wäre euch sehr dankebar |
Re: Ampel programmieren
Hallo
Um es einfach zu halten, könntest du 3 TShapes (Circle) nehmen, welche ebenfalls auf einen TShape (Rechteck, schwart) gesetzt werden. Beim Buttonclick änderst du dann einfach die Farben der Shapes, mit einem ![]() |
Re: Ampel programmieren
habe jjetzt rumprobiert aber ich krieg die verdammte ampel einfach nicht zum laufen...sie bleibt immer bei rot stehen !
hier mein Quellentext:
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 Phase: Integer; Zeit: Integer; { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin case Phase of 1: begin SRot.Brush.Color:= clRed; SGelb.Brush.Color:= clBlack; SGruen.Brush.Color:= clBlack; Phase:= Phase + 1; end; 2: begin SRot.Brush.Color:= clRed; SGelb.Brush.Color:= clYellow; SGruen.Brush.Color:= clBlack; Phase:= Phase + 1; end; 3: begin SRot.Brush.Color:= clBlack; SGelb.Brush.Color:= clBlack; SGruen.Brush.Color:= clGreen; Phase:= Phase + 1; end; 4: begin SRot.Brush.Color:= clBlack; SGelb.Brush.Color:= clYellow; SGruen.Brush.Color:= clBlack; Phase:= 1 end; end; end; procedure TForm2.FormCreate(Sender: TObject); begin Phase:= 1; Zeit:= 1; end; { Rr } procedure TForm2.Button3Click(Sender: TObject); begin close; end; procedure TForm2.Timer1Timer(Sender: TObject); begin begin Zeit:= Zeit + 1; case Zeit of 1..5 : Phase:= 1; 6 : Phase:= 2; 7..11: Phase:= 3; 12 : begin Phase:= 4; Zeit:= 0; end; end; end; end; end. |
Re: Ampel programmieren
Wäre es nicht einfacher den Code, der unter ButtonClick steht, in den Timer zu schreiben und im ButtonClick einfach den Timer zu aktivieren. Sobald im Timer die Phase 4 erreicht ist, deaktivierst du ihn dort wieder.
edit: Ich sehe grad noch, dass du unterschiedliche Phasenzeiten haben willst. Dazu könntest du einfach im jeweiligen case-Abschnitt die Zeit des Timers setzen. |
Re: Ampel programmieren
Hi,
ist doch erstmal nicht schlecht :-D (1) wird wahrscheinlich der Timer bereits bei Programmstart aktiv sein. Damit funkt der dir ständig dazwischen, wenn du manuell umschalten willst. --> Timer.Enabled := False; setzen (2) der Timer zählt munter die Zeit und schaltet die Phasen, aber angezeigt wird nichts. --> du musst Button1Click(NIL) am Ende der Timerprozedur aufrufen. (3) [edit; vergessen] auf einen dritten Butten das Ein-/Ausschalten des Timers legen. --> Timer1.Enabled := not Timer1.Enabled; |
Re: Ampel programmieren
Zitat:
|
Re: Ampel programmieren
es funktioniert jetzt alles !
vielen dank für eure hilfe ! |
Re: Ampel programmieren
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:
Die Getter/Setter für Properties eigenen sich hier sehr schön, weil dadurch die Programmierung der Steuerung sehr simpel ausfällt :)
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. [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] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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 by Thomas Breitkreuz