![]() |
Kreuzungs Ampel Problem
Also erstmal vorab:
1. falls dass in der falschen Kategorie steht bitte moven, bin neu sry. 2. ja ich habe die Suchfunktion von google dem Forum und diversen anderen Seiten benutzt und bin nie auf eine brauchbare lösung gekommen. Ich habe von meinem Lehrer den Auftrag bekommen eine Ampel kreuzung zu schreiben, woran ich glorreich gescheitert bin, dann habe ich ein neues Projekt erstellt und mit einer einfachen Ampel von vorne angefangen
Delphi-Quellcode:
Also eine einfache if then else reihenfolge, aber ich habe dass problemm, dass die Form nichts anzeigt (der button leuchtet nur) Timer intervall ist 1000
procedure TForm1.Button1Click(Sender: TObject);
begin {Rot1.visible := true; sleep(1000); Application.ProcessMessages; if Rot1.visible = true then begin Rot1.visible := false; Gelb1.visible := false; Gruen1.visible := false; Rotgelb1.visible := true; end;} timer1.enabled := true; end; procedure TForm1.FormCreate(Sender: TObject); begin Gruen1.visible := false; Gelb1.visible := false; Rot1.visible := false; Rotgelb1.visible := false; timer1.enabled := false; end; procedure TForm1.Timer1StopTimer(Sender: TObject); begin end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Rot1.visible then begin Rot1.visible := false; Gelb1.visible := false; Gruen1.visible := false; Rotgelb1.visible := true; sleep(1000); Application.ProcessMessages; end else If RotGelb1.visible then begin Rot1.Visible:=False; Gelb1.Visible:=false; Gruen1.visible:=true; RotGelb1.visible:=False; sleep(1000); Application.ProcessMessages; end else If Gruen1.visible then begin Rot1.Visible:=False; Gelb1.Visible:=true; Gruen1.visible:=False; RotGelb1.visible:=False; sleep(1000); Application.ProcessMessages; end else If Gelb1.visible then begin Rot1.Visible:=true; Gelb1.Visible:=false; Gruen1.visible:=False; RotGelb1.visible:=False; Application.ProcessMessages; sleep(1000); end; end; der befehl Application.ProcessMessages; klappt irgendwie nicht und auch die sleep funktion stellt nichts dar.(Mit einer Anweisung hats geklappt, aber nach einer Sekunde nichterscheinen erschien Zustand Rotgelb.) Wie kann ich es hinkriegen dass er mir bei code 2 regelmäßig etwas darstellt? |
AW: Kreuzungs Ampel Problem
Hallo,
beim Starten sind keine Ampelfarben aktiv (siehe OnCreate: dort versteckst du alle (visible := false). Versuch doch mal folgendes:
Delphi-Quellcode:
Ach ja, wenn der Timer-Intervall auf 1000 steht (1000ms = 1s), dann kannst du dir die sleeps sparen (ebenso: Application.ProcessMessages;)
procedure TForm1.Button1Click(Sender: TObject);
begin Rot1.visible := true; timer1.enabled := true; end; |
AW: Kreuzungs Ampel Problem
Du brauchst weder Application.ProcessMessages noch Sleep. Dein Problem ist: Du fragst Komponenten ab, ob sie sichtbar sind. Leider stellst Du intial alle auf unsichtbar, daher trifft keine der Bedingungen im Timer zu.
[edit] Was z.B. eine Möglichkeit wäre, im Timer die letzte Bedingung einfach wegzulassen: Zitat:
Delphi-Quellcode:
[/edit]
else
// If Gelb1.visible then begin Rot1.Visible:=true; Gelb1.Visible:=false; Gruen1.visible:=False; RotGelb1.visible:=False; end; |
AW: Kreuzungs Ampel Problem
Zum Thema Ampel gibt es alleine hier im Forum reichlich Beiträge
![]() und bei Tante google ![]() Wonach hast du gesucht? |
AW: Kreuzungs Ampel Problem
Danke Helmi, ich habe rot auf visible gestell und auf einmal funktionierts.:-D
Aber wenn ich ausführe springt er ganz schnell von Grün über Gelb auf Rot, schneller als er runterschaltet ------------------------------------------- Edit: Es lag an dem Sleep und an dem Application.processmessages. ich habe dass weg gemacht und dann funkts |
AW: Kreuzungs Ampel Problem
Ein Ampel hat doch verschiedene (Ampel-)Phasen.
Diese Phasen kann man durchnumerieren (0=alles aus, 1=rot, 2=rot+gelb,...) Dann braucht man doch nur noch im Timer die Ampelphase hochzählen und entsprechend der Phase die Lämpchen an- und ausmachen. Und natürlich noch aufpassen, dass nachdem die letzte Pase erreicht wurde wieder auf Phase 1 zurückgesetzt wird. |
AW: Kreuzungs Ampel Problem
Genau dazu gibt es zumindest von mir irgendwo einen Beispielcode, der sollte sich über die Suche finden lassen.
|
AW: Kreuzungs Ampel Problem
Zitat:
ich habe den code gelöscht, aber ich weiß dass er entweder gar nicht oder direkt zur endphase geschaltet hat. ich habe dass mit in(i) gemacht |
AW: Kreuzungs Ampel Problem
Ich kann Dich schwer einschätzen, aber das ist Dir vermutlich noch zu hoch. Trotzdem mal eine kleine Klasse:
Delphi-Quellcode:
Nun musst Du "nur noch" eine Instanz dieser Klasse erzeugen, dem Event eine kompatible Methode zuweisen und in einem Timer NextPhase aufrufen.
type
TAmpel = class; TAmpelphase = (apRot, apGelbRot, apGruen, apGelb); TOnNextPhase = procedure(Sender: TAmpel; Phase: TAmpelphase) of object; TAmpel = class private FPhase: TAmpelphase; FOnNextPhase: TOnNextPhase; public procedure NextPhase; property OnNextPhase: TOnNextPhase read FOnNextPhase write FOnNextPhase; end; ... procedure TAmpel.NextPhase; begin case FPhase of apRot: FPhase := apGelbRot; apGelbRot: FPhase := apGruen; apGruen: FPhase := apGelb; apGelb: FPhase := apRot; end; if Assigned(FOnNextPhase) then FOnNextPhase(self, FPhase); end; |
AW: Kreuzungs Ampel Problem
auch wenn beim erzeugen der Instanz die Variablen initialisiert werden, aber du solltest vielleicht
die Variable "FPhase" im Create initialisieren (theoretisch steht sie aber auf apRot) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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