Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ampelschaltung mit 1 Timer inkl. Interval.. dringend Hilfe


tuni94 - Di 02.11.10 17:54
Titel: Ampelschaltung mit 1 Timer inkl. Interval.. dringend Hilfe
Morgen,

Ich schreiben morgen eine Klausur, da wird zusätzlich das Thema Ampelschaltung mit einem Timer vorkommen. Aber ich war das letzte mal im Unterricht nicht anwesend und habe den Quelltext bzw. den Anfang nicht mitbekommen.
Aufgabe: Wir sollen eine Ampel erstellen (4 Images:Rot-Rotgelb-Grün-Gelb) diese 4 Bilder sollen durch einen Klick, der den Timer in Gang setzt laufen. Das mit dem Interval ist so, dass die Rote Ampel und die grüne Ampel länger "aufleuchten" als die Rotgelb und Gelb. Diese soll ich in einem Quelltext zusammenfassen.
Nach langer Suche habe ich aber leider nicht das richtige gefunden, obwohl es sehr viele Themen zu der Ampelschaltung gibt. Also ich glaube If-Anweisungen müssen vorhanden sein (?).
Ich bitte euch somit um dringende Hilfe ..

Mfg Tuni




Und wie ich grad seh, hab ich hier keine Icons mit einer Ampel drauf. Wäre nett einen Link zu posten


platzwart - Di 02.11.10 18:32

Ehm... erwartest du nun ernsthaft, dass dir hier jemand das ganze Projekt so aus Spaß innerhalb der nächten Stunden schreibt? Wenn du konkrete Fragen hast, helfen wir dir gerne, aber deine Arbeit an sich wird mit Sicherheit niemand abnehmen.
Hast du denn einen Ansatz? Hast du das ganze mal auf Papier aufgezeichnet? Wo genau kommst du denn nicht weiter?


tuni94 - Di 02.11.10 18:38

Ok ich sage es mal so:
Ansatz brauche ich ja nur vielleicht das erste Beispiel..
Aber ich habe in der Zeit schon etwas versucht, aber es klappt leider nocht nicht.


Image1=Rot Image2=Rotgelb Image3=Grün Image4=Gelb



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
procedure TForm1.Button1Click(Sender: TObject);
  begin
if Button1.Caption='Start'
then begin
    Timer1.enabled:=true ;
    Button1.Caption:='Stop' ;
end
    else if Button1.caption='Stop'
      then begin
        Timer1.enabled:=false ;
        Button1.caption:='Start' ;
      end

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

if image1.Visible=false
  then begin
    image1.Visible:=true ;
    image4.Visible:=false ;
  end
    else if image1.visible=true
      then begin
        image1.visible:=false;
        image2.visible:=true ;
      end
        else if image2.Visible=true
          then begin
          image2.visible:=false;
          image3.Visible:=true;
          end
            else if image3.visible=true
              then begin
              image3.visible:=false ;
              image4.visible:=true;
              end
                
end;

end.


Moderiert von user profile iconMartok: Delphi-Tags gesetzt


platzwart - Di 02.11.10 18:39

Und was genau geht nicht?


elundril - Di 02.11.10 18:41

die verschiedenen Zeiten bei der Ampel (das grün länger ist als die anderen Phasen) kannst du erreichen indem du den intervall vom timer immer dann anders setzt. (vor dem grün schalten länger, nach dem grün schalten wieder kürzer usw)

lg elundril


Xion - Di 02.11.10 18:43

user profile icontuni94 hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
if image1.Visible=false  //wenn NICHT Rot
  then begin
    image1.Visible:=true ;       
    image4.Visible:=false ;      
  end


Das ist natürlich Quatsch, denn Image 1 ist ja nie sichtbar (außer in der Rot-Phase). Das heißt du schaltest IMMER in die Rot-Phase, wenns nicht gerade rot ist.

Also besser auf true prüfen, wie bei den andren else-Zweigen auch. Dafür musst du irgendwann mal eins vorher auf true setzen ODER du müsstest gucken, ob GARKEINS sichtbar ist, und dann rot sichtbar machen.

Es hilft übrigens ungemein, die images mit Namen zu versehen (z.B. imgRot) oder einen Kommentar dranzuschreiben

Wenn du noch Icons brauchst, hab welche hier.


tuni94 - Di 02.11.10 18:45

//EDIT


Hab es mal umgeschrieben :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
procedure TForm1.Button1Click(Sender: TObject);
  begin
if Button1.Caption='Start'
then begin
    Timer1.enabled:=true ;
    Button1.Caption:='Stop' ;
    image1.visible:=true ;
end
    else if Button1.caption='Stop'
      then begin
        Timer1.enabled:=false ;
        Button1.caption:='Start' ;
      end

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin


if image1.visible=true
      then begin
        image1.visible:=false;
        image2.visible:=true ;
        image3.Visible:=false ;
        image4.Visible:=false ;
      end
        else if image2.Visible=true
          then begin
          image2.visible:=false;
          image3.Visible:=true;
          image1.Visible:=false ;
          image4.Visible:=false ;
          end
            else if image3.visible=true
              then begin
              image3.visible:=false ;
              image4.visible:=true;
              image1.Visible:=false ;
              image2.Visible:=false ;
              end

             else if image4.visible=true
                then begin 
                    image1.visibel:=true;
                    image3.visible:=false ; 
                    image2.visible:=false ;
                    image4.visible:=false;
               end   
end;

end.


Nun es springt von Rot auf Rotgelb, aber mehr geht auch nicht .
@ Elundril meinst du das mit dem Interval so:
Ich hab in Erinnerung das man das so schreibt zb;
beim Timer:

Delphi-Quelltext
1:
2:
3:
4:
5:
begin 
image3.visible:=true 
interval=500

end


oder irgendwie sowas

aber bis jetzt danke für eure Hilfe :)

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


elundril - Di 02.11.10 18:48

jap, so in der art mein ich das (aber nur in der art, ein bisschen mehr gehört da noch dazu). außerdem: bei den if-anweisungen niemals auf false oder true überprüfen.

lg elundril


Xion - Di 02.11.10 18:49

user profile icontuni94 hat folgendes geschrieben Zum zitierten Posting springen:
Hab es mal umgeschrieben :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if image1.Visible=false
  then begin
    image1.Visible:=true ;
    image3.Visible:=false ;
    image2.Visible:=false ;
    image4.Visible:=false ;

  end



Du musst überprüfen ob Image4 sichtbar ist! Nach Rotgelb kommt Rot. Am Anfang musst du natürlich irgendein Image sichtbar machen, damit die Ampel loslegen kann.

Mensch die Antworten kommen ja hier im Sekundentakt rein *schneller tippt*


tuni94 - Di 02.11.10 18:50

Habs oben mal editiert :)


Xion - Di 02.11.10 18:56

und? Auswirkung? :D noch Probleme?

Edit: So ganz passt es noch nicht, Image1 darfst du nicht bei Start setzen (dann wirds immer rot wenn du die Ampel weiterlaufen lassen willst) sondern ich würde das ins OnCreate der Form setzen. Oder noch einfacher, ganz unten nach den else if einfach ein else, wo du dann Image1 auf sichtbar setzt


Martok - Di 02.11.10 18:58

Wo du schonmal dabei bist:

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAGde98e1061ea2d60a7e9038b2b3c90c98}</span></span>                    

Wird:

Delphi-Quelltext
1:
var Test: integer;                    


Viele Grüße,
Martok


Gerd Kayser - Di 02.11.10 19:03

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Du musst überprüfen ob Image4 sichtbar ist!
Ich würde in der Timerroutine einfach mit einem Case arbeiten und dazu eine globale IntegerVariable:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
case Ampelstatus of
  1 :   //Grünphase
      begin
        Image1.Visible := true;
        ...
        Timer1.Intervall := 10000;  // 10 Sekunden
        Inc(Ampelstatus);
      end;
  2 :  // Gelbphase
usw.

Und im letzten Anweisungsblock statt Inc(Ampelstatus) einfach Ampelstatus wieder auf 1 setzen.


tuni94 - Di 02.11.10 19:11

So habs nun so :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure TForm1.Button1Click(Sender: TObject);
  begin
if Button1.Caption='Start'
then begin
    Timer1.enabled:=true ;
    Button1.Caption:='Stop' ;

end
    else if Button1.caption='Stop'
      then begin
        Timer1.enabled:=false ;
        Button1.caption:='Start' ;
      end
     
end;

procedure TForm1.Timer1Timer(Sender: TObject);
 begin
 if image1.visible=true
      then begin
        image1.visible:=false;
        image2.visible:=true ;
        image3.Visible:=false ;
        image4.Visible:=false ;
      end
        else if image2.Visible=true
          then begin
          image2.visible:=false;
          image3.Visible:=true;
          image1.Visible:=false ;
          image4.Visible:=false ;
          end
            else if image3.visible=true
              then begin
              image3.visible:=false ;
              image4.visible:=true;
              image1.Visible:=false ;
              image2.Visible:=false ;
              end
                else if image4.visible=true
                 then begin
                   image3.Visible:=false ;
                   image4.Visible:=false ;
                   image1.Visible:=true ;
                   image2.Visible:=false ;
                   end

end;


Nun hab ich nur noch das Problem, was Xion erwähnt hat, dass am Anfang alle Ampeln sichtbar sind und dann bei Button1click direkt auf Rotgelb springt.
Die anderen Themen sind alle Leicht, hoffe werde mein Können in der Klausur auch zeigen :)

@ Gerd Kayser würd ich ja gern, aber keine Ahnung ob es unser Lehrer es so sehen will


elundril - Di 02.11.10 19:23

das kann ja keiner mitansehen. mal überarbeitet (siehe kommentare im Quelltext):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Button1.Caption='Start' then begin
    Timer1.enabled:=true ;
    Button1.Caption:='Stop' ;
    end
  else begin // zweite if-abfrage unnötig, der button kann eh nur 2 zustände haben hoff ich
    Timer1.enabled:=false ;
    Button1.caption:='Start' ;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if image1.visible then begin  //nie auf = true oder = false überprüfen!
    image1.visible := false;  //benenne die images logisch!! ZB imgRot und so weiter
    image2.visible := true;
    image3.Visible := false;
    image4.Visible := false;
    timer1.interval := 10000//10 sekunden grün
    end
  else if image2.Visible then begin
    image2.visible := false;
    image3.Visible := true;
    image1.Visible := false;
    image4.Visible := false;
    timer1.interval := 2000//2 sekunden
    end
  else if image3.visible then begin
    image3.visible := false;
    image4.visible := true;
    image1.Visible := false;
    image2.Visible := false;
    timer1.interval := 2000//2 sekunden
    end
  else if image4.visible then begin
    image3.Visible := false;
    image4.Visible := false;
    image1.Visible := true;
    image2.Visible := false;
    timer1.interval := 10000//2 sekunden
    end;
end;


btw, warum 4 images bei einer ampel? Wir in österreich haben nur 3 Farben bei einer Ampel...

lg elundril


Xion - Di 02.11.10 19:25

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:

btw, warum 4 images bei einer ampel? Wir in österreich haben nur 3 Farben bei einer Ampel...


Ne, das ist ja zu einfach. In Deutschland gibt es einen Unterschied zwischen Gelb und Gelb ;) Wird es nämlich gleich grün, dann ist es RotGelb, wird es gleich Rot, dann leuchtet nur gelb.


Martok - Di 02.11.10 19:31

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Ne, das ist ja zu einfach. In Deutschland gibt es einen Unterschied zwischen Gelb und Gelb ;) Wird es nämlich gleich grün, dann ist es RotGelb, wird es gleich Rot, dann leuchtet nur gelb.

Das sind aber immer noch nur 3 Farben ;)

Quelltext
1:
2:
R -> RY-> G
G -> Y -> R


tuni94 - Di 02.11.10 19:38


Delphi-Quelltext
1:
 if image1.visible then begin ..                    

wenn ich es so am anfang reinschreibe. Dann bleibt die Ampel ja immer auf einer Farbe? Zumindest bei mir.
Das mit dem Interval hab ichs nun verstanden, nur noch die Ampel am Anfang muss auf Rot bleiben


/Edit

Nach etwas rumprobieren hab ichs raus , hoff ich zumindest. Da die Ampel wieder auf Rot geht, wenn ich auf den Button 'Stop' klicke:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
  begin
if Button1.Caption='Start'
then begin
    Timer1.enabled:=true ;
    Button1.Caption:='Stop' ;

end

    else  begin
        Timer1.enabled:=false ;
        Button1.caption:='Start' ;
      end ;
       begin
       Image1.Visible:=true ;
      image2.Visible:=false ;
      image3.Visible:=false ;
      image4.Visible:=false ;
      end
end;