Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kreuzung - Timer funktioniert nicht (https://www.delphipraxis.net/142839-kreuzung-timer-funktioniert-nicht.html)

Ghostleader 4. Nov 2009 18:55


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;

SirThornberry 4. Nov 2009 18:57

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.

Ghostleader 4. Nov 2009 19:01

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.

Matze 4. Nov 2009 19:05

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:
if Ampel1Ro.Visible then
Das hier ist übrigens falsch:

Delphi-Quellcode:
if Ampel1Ro.Visible { = True } then
begin
   Ampel1Ro.Visible:= False;
   Ampel1Ge.Visible:= True;
end;
Es muss so lauten:

Delphi-Quellcode:
if Ampel1Ro.Visible then
begin
   Ampel1Ge.Visible := true;
end;
Warum? Schau dir mal die Ampeln an. Die Springen nicht von Rot auf Gelb, sondern auf Rot-Gelb.

Des Weiteren könntest du deine if-Abfragen mit einem "else" verbinden.

Grüße, Matze

DeddyH 4. Nov 2009 19:08

Re: Kreuzung - Timer funktioniert nicht
 
Klar bleibt die rot.
Zitat:

Delphi-Quellcode:
procedure TForm1.TmAmpelTimer(Sender: TObject);
begin
  if Ampel1Ro.Visible{ = True} then //trifft zu
    begin
      Ampel1Ro.Visible:= False;
      Ampel1Ge.Visible:= True;     //jetzt gelb sichtbar
    end;
  if Ampel1Ge.Visible{ = True} then //trifft nach obiger Änderung zu
    begin
      Ampel1Ge.Visible:= False;
      Ampel1Gr.Visible:=True;      //nun grün sichtbar
    end;
  if Ampel1Gr.Visible{ = True} then //trifft also zu
    begin
      Ampel1Gr.Visible:= False;
      Ampel1Ro.Visible:= True;     //jetzt sind wir wieder auf rot
    end;


Matze 4. Nov 2009 19:10

Re: Kreuzung - Timer funktioniert nicht
 
Stimmt, dann trägt mein Beitrag (entgegen meiner Aussage) doch zur Lösung des Problems bei. :lol:

DeddyH 4. Nov 2009 19:11

Re: Kreuzung - Timer funktioniert nicht
 
Genau, "Frau Else" kann es richten ;)

Ghostleader 4. Nov 2009 19:11

Re: Kreuzung - Timer funktioniert nicht
 
@ Matze:
Hmm... ich verstehe jetzt nicht was an
Delphi-Quellcode:
if Ampel1Ro.Visible:= True then
falsch ist und an
Delphi-Quellcode:
if Ampel1Ro.Visible then
So wie du es willst, wird doch:
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.

Matze 4. Nov 2009 19:12

Re: Kreuzung - Timer funktioniert nicht
 
Zitat:

Zitat von Ghostleader
wenn Ampel1Ro sichtbar ist, Ampel1Ge sichtbar aber Ampel1Ro nicht unsichtbar?!

Richtig (Erklärung, s. meinen Beitrag).

Zum "= true": Über den Umgang mit Boolean

Edit: s. auch Wikipedia: Ampel

Ghostleader 4. Nov 2009 19:16

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...

Matze 4. Nov 2009 19:19

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.

Ghostleader 4. Nov 2009 19:25

Re: Kreuzung - Timer funktioniert nicht
 
Das von DeddyH hatte ich eben nicht verstanden:
Zitat:

"Frau Else kann es richten"
bzw. dachte ich das wäre ein normaler Name und mir ist das "Else" nicht aufgefallen! - zu deiner Aussage ich würde die Beiträge nur "überfliegen".

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.

Matze 4. Nov 2009 19:28

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.

DeddyH 4. Nov 2009 19:29

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).

Ghostleader 4. Nov 2009 19:33

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

Matze 4. Nov 2009 19:36

Re: Kreuzung - Timer funktioniert nicht
 
Rein theoretisch gibt's zig Möglichkeiten, eine könnte so aussehen:

Delphi-Quellcode:
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;
In den If-Anweisungen kannst du dann deine Images entsprechend ein- bzw. ausblenden.

DeddyH 4. Nov 2009 19:39

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.

Ghostleader 4. Nov 2009 19:50

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

turboPASCAL 4. Nov 2009 20:16

Re: Kreuzung - Timer funktioniert nicht
 
Habe auch einen:
Delphi-Quellcode:
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;
:mrgreen:

DeddyH 4. Nov 2009 20:26

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:
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;
Ist das so verständlicher?

Ghostleader 5. Nov 2009 13:53

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!

Ghostleader 7. Nov 2009 18:37

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:
   
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;
Ich habe NUR noch das Problem mit der Reihenfolge und ignoriere eure Tipps auch NICHT.

markus5766h 7. Nov 2009 19:07

Re: Kreuzung - Timer funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

vielleicht auch so (siehe Anhang, *.exe und Quelldateien) ?

Delphi-Quellcode:
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.
... ist mit Sicherheit noch optimierungsfähig (nur 'mal so eben schnell "zusammengeschustert")

Ghostleader 7. Nov 2009 19:49

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

Teekeks 7. Nov 2009 21:41

Re: Kreuzung - Timer funktioniert nicht
 
Zitat:

Zitat von Ghostleader
Folgendes Problem:
Die Ampel schalltet nicht wie sie soll sondern so:
Rot, Gelb, Gelbrot, Grün

Hast du evtl. die Bezeichnungen vertauscht?
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;

Ghostleader 7. Nov 2009 21:46

Re: Kreuzung - Timer funktioniert nicht
 
nein soweit ich das sehe habe ich nichts vertauscht

Ghostleader 7. Nov 2009 21:49

Re: Kreuzung - Timer funktioniert nicht
 
hat sich erledigt habe den fehler jetzt ENDLICH gefunden ;) danke für die hilfe mfg Ghost

Matze 7. Nov 2009 21:53

Re: Kreuzung - Timer funktioniert nicht
 
Zitat:

Zitat von Ghostleader
hat mir schonmal jemand gesagt aber:
wieso?

Zitat:

Zitat von Matze

Und jetzt schreibe bitte nicht wieder du hättest alles hier genau gelesen. Wie du siehst, hast du es nicht. Klicke den Link an und lies, was dort steht, dann weißt du wieso.

Micha88 12. Nov 2009 07:21

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 11:02 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