![]() |
Kreuzung - Timer funktioniert nicht
Hay!
Ich programmiere gerade eine Kreuzung. Auf dieser soll ein Auto ganz simpel fahren und bei Rot anhalten. Eigentlich kein Problem. Ich habe seit längerem nichts mehr programmiert und bin ein wenig aus der Übung. Könnte jemand von euch mir auf die Sprünge helfen und mir meinen Fehler zeigen? Ich bin momentan wohl ein wenig blind... Mit freundlichen Grüßen, Ghost
Delphi-Quellcode:
procedure TForm1.TmAmpelTimer(Sender: TObject);
begin if Ampel1Ro.Visible = True then begin Ampel1Ro.Visible:= False; Ampel1Ge.Visible:= True; end; if Ampel1Ge.Visible = True then begin Ampel1Ge.Visible:= False; Ampel1Gr.Visible:=True; end; if Ampel1Gr.Visible = True then begin Ampel1Gr.Visible:= False; Ampel1Ro.Visible:= True; end; |
Re: Kreuzung - Timer funktioniert nicht
Verrätst du uns was dich zu der Annahme treibt das ein Fehler vorliegt?
Denn ein Fehler ist ein Verhalten das eintritt, welches nach Erkenntnis des Schöpfers aber nicht eintreten soll. |
Re: Kreuzung - Timer funktioniert nicht
:D Na klar.
Also ich will ja einfach eine Kreuzung machen und habe einfach einen Timer draufgesetzt. Ich habe den vollständigen Code angegeben (den den ich auch hier geschrieben habe) und das Image1 (Ampel1Ro = Ampel1 Rot ) ist das einzigste sichtbare. Image2 (Ampel1Ge = Ampe1lGelb) und Image3 (Ampel1Gr = Ampel1Grün) sind unsichtbar. Nun soll wenn Ampel1Rot ist [,nach Ablauf des Timerintervalls (1000)] Ampel1Ro unsichtbar werden und Ampel1Ge sichtbar werden. Danach soll Ampel1Ge unsichtbar werden und Ampel1Gr sichtbar werden. Irgendwas im Code des Timers funktioniert also nicht, denn es passiert einfach nichts. Die Ampel bleibt die ganze Zeit Rot! Ich hoffe damit habe ich deine Frage beantwortet. |
Re: Kreuzung - Timer funktioniert nicht
Hallo,
ein paar Kleinigkeiten, die mit dem Problem nichts zu tun haben. Überprüfe nie auf "true", auch wenn es in dem Fall geht. Schreibe es so:
Delphi-Quellcode:
Das hier ist übrigens falsch:
if Ampel1Ro.Visible then
Delphi-Quellcode:
Es muss so lauten:
if Ampel1Ro.Visible { = True } then
begin Ampel1Ro.Visible:= False; Ampel1Ge.Visible:= True; end;
Delphi-Quellcode:
Warum? Schau dir mal die Ampeln an. Die Springen nicht von Rot auf Gelb, sondern auf Rot-Gelb.
if Ampel1Ro.Visible then
begin Ampel1Ge.Visible := true; end; Des Weiteren könntest du deine if-Abfragen mit einem "else" verbinden. Grüße, Matze |
Re: Kreuzung - Timer funktioniert nicht
Klar bleibt die rot.
Zitat:
|
Re: Kreuzung - Timer funktioniert nicht
Stimmt, dann trägt mein Beitrag (entgegen meiner Aussage) doch zur Lösung des Problems bei. :lol:
|
Re: Kreuzung - Timer funktioniert nicht
Genau, "Frau Else" kann es richten ;)
|
Re: Kreuzung - Timer funktioniert nicht
@ Matze:
Hmm... ich verstehe jetzt nicht was an
Delphi-Quellcode:
falsch ist und an
if Ampel1Ro.Visible:= True then
Delphi-Quellcode:
So wie du es willst, wird doch:
if Ampel1Ro.Visible then
wenn Ampel1Ro sichtbar ist, Ampel1Ge sichtbar aber Ampel1Ro nicht unsichtbar?! Ja ich weiß ich hätte auch die passenenden Symbole dafür, das Problem ist: Ich bin zu faul dafür ;). ...und so geht es ja eigentlich auch. @ Deddy H: Ist das Problem etwa das die Ampel so schnell umschaltet das ich das nicht sehe? Ich denke jeder einzelne if-Befehl wird IMMER nach Ablauf des Timer-Intervalls ausgeführt und nicht in 0,1 "Verarbeitungssekunden" von meinem Computer, oder irre ich mich da. |
Re: Kreuzung - Timer funktioniert nicht
Zitat:
Zum "= true": ![]() Edit: s. auch ![]() |
Re: Kreuzung - Timer funktioniert nicht
Ich möchte aber doch das die rote Ampel unsichtbar ist wenn die gelbe sichtbar ist damit sich da nichts überdeckt?
Mein eigentliches Problem ist es doch das sich NICHTS verändert, die Ampel aber schalten soll... |
Re: Kreuzung - Timer funktioniert nicht
Dein Problem lösen 2 zusätzliche "else". Das wurde bereits genannt und sogar von Deddy erklärt.
Was du machst, ist eine Ampel, wie man sie im Kindergarten malt: Rot - Gelb - Grün. Tatsächlich sind die Ampeln bei uns Rot - Rot/Gelb - Gelb - Grün (du scheinst Beiträge nur zu überfliegen, wenn überhaupt ...) Aber das war nur ein Hinweis. Wenn du es nicht an die Realität anlehnen willst, musst du das natürlich nicht. |
Re: Kreuzung - Timer funktioniert nicht
Das von DeddyH hatte ich eben nicht verstanden:
Zitat:
Ich weiß das die Ampeln so schalten: Rot - Rot/Gelb - Gelb - Grün und dazu habe ich auch schon geantwortet: Ich bin zu faul. Wieso sollte es mit einem weiteren Image besser klappen? Also lasse ich es raus! Danke für deine Antwort, ich werde es mal mit else probieren. |
Re: Kreuzung - Timer funktioniert nicht
Wofür denn ein weiteres Image? Es gibt doch nur 3 Lämpchen und somit 3 Images:
Delphi-Quellcode:
;)
if (ImgRot.Visible) and (ImgGelb.Visible) then
// Rot/Gelb else if ImgRot.Visible then // Rot else if ImgGelb.Visible then // Gelb else if ImgGruen.Visible then // Grün Naja das Problem ist nun geklärt. Viel Spaß noch. |
Re: Kreuzung - Timer funktioniert nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Das geht übrigens auch ohne else, wenn man Logik und Darstellung trennt. Das Beispiel im Anhang besteht aus 3 Shapes, einem Timer und einer Unit mit 43 Zeilen (bei meiner Art der Codeformatierung).
|
Re: Kreuzung - Timer funktioniert nicht
Aha.. Würdest du mir auch den Text mal hochladen? Ich würde mal gerne sehen wie man das ohne else machen kann...
Mfg Ghost |
Re: Kreuzung - Timer funktioniert nicht
Rein theoretisch gibt's zig Möglichkeiten, eine könnte so aussehen:
Delphi-Quellcode:
In den If-Anweisungen kannst du dann deine Images entsprechend ein- bzw. ausblenden.
var
Ampelzustand: Integer; // ... // Rot if Ampelzustand = 1 then Ampelzustand := 2; // Rot Gelb if Ampelzustand = 2 then AmpelZustand := 3; // Gelb if Ampelzustand = 3 then AmpelZustand := 4; // Grün if AmpelZustand = 4 then AmpelZustand := 1; |
Re: Kreuzung - Timer funktioniert nicht
OK, ein "else" ist doch dabei hab ich gerade gesehen :lol:
Delphi-Quellcode:
unit AmpelMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TAmpelzustand = (azRot, azGelbRot, azGruen, azGelb); TFormAmpel = class(TForm) shpRot: TShape; shpGelb: TShape; shpGruen: TShape; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } FZustand: TAmpelzustand; public { Public-Deklarationen } end; var FormAmpel: TFormAmpel; implementation {$R *.dfm} procedure TFormAmpel.Timer1Timer(Sender: TObject); begin if FZustand < High(TAmpelzustand) then inc(FZustand) else //hier ist das einzige else FZustand := Low(TAmpelzustand); shpRot.Visible := FZustand in [azRot,azGelbRot]; shpGelb.Visible := FZustand in [azGelb,azGelbRot]; shpGruen.Visible := FZustand = azGruen; end; end. |
Re: Kreuzung - Timer funktioniert nicht
Oha das übersteigt jetzt aber meine Kentnisse. Naja danke für die Antworten jetzt werde ich mir das schon zurecht"schnibbeln" können.
Mit freundliochen Grüßen Ghostleader |
Re: Kreuzung - Timer funktioniert nicht
Habe auch einen:
Delphi-Quellcode:
:mrgreen:
var
at: array [0..3,0..3] of integer = ((1,0,0,5500),(1,1,0,500),(0,0,1,5000),(0,1,0,1000)); procedure TForm1.Timer1Timer(Sender: TObject); begin shape1.Visible := boolean(at[Timer1.Tag, 0]); shape2.Visible := boolean(at[Timer1.Tag, 1]); shape3.Visible := boolean(at[Timer1.Tag, 2]); Timer1.Interval := at[Timer1.Tag, 3]; if Timer1.Tag > 2 then Timer1.Tag := 0 else Timer1.Tag:= Timer1.Tag +1; end; |
Re: Kreuzung - Timer funktioniert nicht
Wird das jetzt wieder so ein "negative Zahlen"-Thread? :mrgreen: Zum besseren Verständnis hier mein Timer-Ereignis noch einmal in längerer Form:
Delphi-Quellcode:
Ist das so verständlicher?
procedure TFormAmpel.Timer1Timer(Sender: TObject);
begin case FZustand of azRot : FZustand := azGelbRot; azGelbRot: FZustand := azGruen; azGruen : FZustand := azGelb; azGelb : FZustand := azRot; end; if (FZustand = azRot) or (FZustand = azGelbRot) then shpRot.Visible := true else shpRot.Visible := false; if (FZustand = azGelb) or (FZustand = azGelbRot) then shpGelb.Visible := true else shpGelb.Visible := false; if FZustand = azGruen then shpGruen.Visible := true else shpGruen.Visible := false; end; |
Re: Kreuzung - Timer funktioniert nicht
Ja das ist verständlich. Nur hab ich noch nie was mit "case" und anderen Dingen gemacht. Aber danke trotzdem!
|
Re: Kreuzung - Timer funktioniert nicht
Folgendes Problem:
Die Ampel schalltet nicht wie sie soll sondern so: Rot, Gelb, Gelbrot, Grün Ich finde meinen Fehler nicht, bitte helft mir:
Delphi-Quellcode:
Ich habe NUR noch das Problem mit der Reihenfolge und ignoriere eure Tipps auch NICHT.if ImAmpel1Ro.Visible = True then begin ImAmpel1Ro.Visible:= False; ImAmpel1Gero.Visible:= True; end else if ImAmpel1Gero.Visible = True then begin ImAmpel1Gero.Visible:= False; ImAmpel1Gr.Visible:= True; end else if ImAmpel1Gr.Visible = True then begin ImAmpel1Gr.Visible:= False; ImAmpel1Ge.Visible:= True; end else if ImAmpel1Ge.Visible = True then begin ImAmpel1Ge.Visible:= False; ImAmpel1Ro.Visible:= True; end; |
Re: Kreuzung - Timer funktioniert nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
vielleicht auch so (siehe Anhang, *.exe und Quelldateien) ?
Delphi-Quellcode:
... ist mit Sicherheit noch optimierungsfähig (nur 'mal so eben schnell "zusammengeschustert")
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Timer1: TTimer; Prot: TPanel; Pgelb: TPanel; Pgruen: TPanel; Edit1: TEdit; Prot2: TPanel; Pgelb2: TPanel; Pgruen2: TPanel; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure ShowAmpel(Sender: TObject); private { Private declarations } phase, phase2 : Integer; counter : Integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin counter := 0; phase := 0; Prot.Visible := False; Pgelb.Visible := False; Pgruen.Visible := False; Prot2.Visible := False; Pgelb2.Visible := False; Pgruen2.Visible := False; Edit1.Text := ''; Timer1.Enabled := True; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled := False; Edit1.Text := ''; Prot.Visible := False; Pgelb.Visible := False; Pgruen.Visible := False; Prot2.Visible := False; Pgelb2.Visible := False; Pgruen2.Visible := False; end; procedure TForm1.Timer1Timer(Sender: TObject); begin counter := counter + 1; //Sekunden case counter of 0..5 : phase := 1; // Rot 6..10 : phase := 2; // Rot-Gelb 11..15 : phase := 3; // Gruen 16..20 : phase := 4; // Gruen 21..25 : phase := 5; // Gelb 26..29 : phase := 6; // Rot 30 : begin phase := 6; counter := 0; end; end; // end case of if (phase + 3) > 6 then phase2 := phase -3 else phase2 := phase +3; Edit1.Text := 'Phase : '+IntToStr(phase); ShowAmpel(Self); end; procedure TForm1.ShowAmpel(Sender: TObject); begin case phase of 1 : begin Prot.Visible := True; end; 2 : begin Prot.Visible := True; Pgelb.Visible := True; end; 3 : begin Prot.Visible := False; Pgelb.Visible := False; Pgruen.Visible := True; end; 4 : begin Prot.Visible := False; Pgelb.Visible := False; Pgruen.Visible := True; end; 5 : begin Pgruen.Visible := False; Pgelb.Visible := True; end; 6 : begin Pgelb.Visible := False; Prot.Visible := True; end; end; // end case of case phase2 of 1 : begin Prot2.Visible := True; end; 2 : begin Prot2.Visible := True; Pgelb2.Visible := True; end; 3 : begin Prot2.Visible := False; Pgelb2.Visible := False; Pgruen2.Visible := True; end; 4 : begin Prot2.Visible := False; Pgelb2.Visible := False; Pgruen2.Visible := True; end; 5 : begin Pgruen2.Visible := False; Pgelb2.Visible := True; end; 6 : begin Pgelb2.Visible := False; Prot2.Visible := True; end; end; // end case of end; end. |
Re: Kreuzung - Timer funktioniert nicht
danke für deine antwort aber ich wüde gerne wissen wieso die ampel in der falschen reihenfolge schaltet... damit ich was lernen und es ändern kann.
mfg ghost |
Re: Kreuzung - Timer funktioniert nicht
Zitat:
Achso: und bitte keinen Vergleich auf true, also bitte das so machen:
Delphi-Quellcode:
if ImAmpel1Ro.Visible{ = True} then begin ImAmpel1Ro.Visible:= False; ImAmpel1Gero.Visible:= True; end else if ImAmpel1Gero.Visible{ = True} then begin ImAmpel1Gero.Visible:= False; ImAmpel1Gr.Visible:= True; end else if ImAmpel1Gr.Visible{ = True} then begin ImAmpel1Gr.Visible:= False; ImAmpel1Ge.Visible:= True; end else if ImAmpel1Ge.Visible{ = True} then begin ImAmpel1Ge.Visible:= False; ImAmpel1Ro.Visible:= True; end; |
Re: Kreuzung - Timer funktioniert nicht
nein soweit ich das sehe habe ich nichts vertauscht
|
Re: Kreuzung - Timer funktioniert nicht
hat sich erledigt habe den fehler jetzt ENDLICH gefunden ;) danke für die hilfe mfg Ghost
|
Re: Kreuzung - Timer funktioniert nicht
Zitat:
Zitat:
|
Re: Kreuzung - Timer funktioniert nicht
Du solltest dir vielleicht nochmal die Delphi-GRUNDlagen ansehen, bevor du loslegst.
Wir sehen ja,. dass du keine Tipps annimst und selbst nach dem X-Ten Mal noch auf True/False vergleichst! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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