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
Martok: 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
tuni94 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| if image1.Visible=false 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
Martok: 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
tuni94 hat folgendes geschrieben : |
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:
Viele Grüße,
Martok
Gerd Kayser - Di 02.11.10 19:03
Xion hat folgendes geschrieben : |
| 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 : begin Image1.Visible := true; ... Timer1.Intervall := 10000; Inc(Ampelstatus); end; 2 : 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 Timer1.enabled:=false ; Button1.caption:='Start' ; end; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if image1.visible then begin image1.visible := false; image2.visible := true; image3.Visible := false; image4.Visible := false; timer1.interval := 10000; end else if image2.Visible then begin image2.visible := false; image3.Visible := true; image1.Visible := false; image4.Visible := false; timer1.interval := 2000; end else if image3.visible then begin image3.visible := false; image4.visible := true; image1.Visible := false; image2.Visible := false; timer1.interval := 2000; end else if image4.visible then begin image3.Visible := false; image4.Visible := false; image1.Visible := true; image2.Visible := false; timer1.interval := 10000; 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
elundril hat folgendes geschrieben : |
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
Xion hat folgendes geschrieben : |
| 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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!