Visual Basic 2010 Ampelsteuerung

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von r1zzor.

    Visual Basic 2010 Ampelsteuerung

    Hallo Leute,
    wir müssen in der Schule eine Ampelphase mit Visual Basic programmieren. Ich möchte erstmal das die einzelnen Ampelphasen nacheinander und nach einer gewissen Zeit abfolgen. Also nach Case 0, folgt Case 1, darauf hin folgt Case 2, Case 3 und Ende. Bin aber total der Neuling, da wir erst seit 4 Stunden programmieren und wir uns mehr oder weniger alles selber beibringen müssen...

    Die Ampel bleibt momentan bei Case 1 stehen...

    Über ein, zwei Hilfestellungen würde ich mich sehr freuen...

    C#-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim Ampel_Status As Integer = 0
    3. Ampel_Status += 1
    4. Select Case Ampel_Status
    5. Case 0
    6. Rot.Visible = True
    7. Gelb.Visible = False
    8. Grün.Visible = False
    9. Case 1
    10. Rot.Visible = True
    11. Gelb.Visible = True
    12. Grün.Visible = False
    13. Case 2
    14. Grün.Visible = False
    15. Gelb.Visible = False
    16. Grün.Visible = True
    17. Case 3
    18. Rot.Visible = False
    19. Gelb.Visible = True
    20. Grün.Visible = False
    21. End Select
    22. End Sub
    Nach dem der Timer in das Tick-Event gelaufen ist, musst du den Timer wieder neu starten. Und Dim Ampel_Status As Integer = 0 sollte außerhalb des Events stehen, da es sonst immer wieder bei 0 anfängt, genauso sollte Ampel_Status += 1 am Ende des Events stehen.
    Man könnte auch direkt über den aktuellen Stand der Ampel selbst codieren und somit eine Übergangsfunktion für jede der Variablen machen, ich habs sogar direkt vereinfacht:

    Quellcode

    1. Rot = oRot ^ oGelb
    2. Gelb = !oGelb
    3. Grün = oRot && oGelb

    wobie o[Farbe] jeweils für den Zustand steht, der aktuell ist und nicht, den nächsten, durch umsortieren braucht man nichtmal extra variablen:

    Quellcode

    1. Grün = Rot && Gelb
    2. Rot = Rot ^ Gelb
    3. Gelb = !Gelb
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @r1zzor Willkommen im Forum. :thumbup:
    Ich würde die Zustände nicht mit 0, 1, 2, 3 beziffern, sondern per Enum im Klartext benennen:

    VB.NET-Quellcode

    1. Enum Ampelphase
    2. Rot
    3. RotGelb
    4. Grün
    5. Gelb
    6. End Enum

    Die Dauer der einzelnen Phasen machst Du, indem Du ihre Länge index-codiert in ein Array packst:

    VB.NET-Quellcode

    1. Dim Dauer As Ampelphase() = {Ampelphase.Rot, Ampelphase.Rot, Ampelphase.Rot, Ampelphase.RotGelb, Ampelphase.Grün, Ampelphase.Grün, Ampelphase.Grün, Ampelphase.Gelb}

    Nun brauchst Du Deinen Zähler, der der den Takt der Ampel durchklickert. Der muss natürlich außerhalb des Timer-Tick-Events deklariert werden.
    Wenn er am Ende des Dauer-Arrays angekommen ist, setzt Du ihn auf 0 und feddich. :D
    =============================
    Natürlich erst, nachdem Du Deinen Fehler beseitigt hast:

    VB.NET-Quellcode

    1. Case 2
    2. Grün.Visible = False
    3. Gelb.Visible = False
    4. Grün.Visible = True

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Vielen Dank für die schnelle Hilfestellung euch 3,
    ich habe mich jetzt an den Tipp von KingLM97 orientiert. Ich bin wie gesagt sehr unerfahren in Bezug auf Visual Basic das programmieren wird in einem halben Jahr sowieso Schnee von Gestern werden, wobei ich sagen muss, dass es Spaß macht. Es funktioniert soweit ganz gut. Auch wenn es sicherlich wesentlich einfacher und strukturierter geht. Wahrscheinlich mit der Lösung von RodFromGermany. Wobei ich jetzt nicht wüsste wie ich das ganze ergänzen müsste...

    Ich habe es jetzt mit der unschönen Variante so programmiert...

    C#-Quellcode

    1. Dim Ampel_Status As Integer = 0
    2. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. Select Case Ampel_Status
    4. Case 0
    5. Rot.Visible = True
    6. Gelb.Visible = False
    7. Grün.Visible = False
    8. Case 1
    9. Rot.Visible = True
    10. Gelb.Visible = True
    11. Grün.Visible = False
    12. Case 2
    13. Rot.Visible = False
    14. Gelb.Visible = False
    15. Grün.Visible = True
    16. Case 3
    17. Rot.Visible = False
    18. Gelb.Visible = True
    19. Grün.Visible = False
    20. Case 4
    21. Rot.Visible = True
    22. Gelb.Visible = False
    23. Grün.Visible = False
    24. Ampel_Status = 0
    25. End Select
    26. Ampel_Status += 1
    27. End Sub


    Nun habe ich leider eine Endlos-Schleife drin...wie werde ich diese los? Am liebsten wäre es mir, dass ich die Ampelphase mit einem "PictureBox1_Click" starten könnte...


    r1zzor schrieb:

    "PictureBox1_Click"
    Machst Du da drin

    VB.NET-Quellcode

    1. Timer1.Enabled = Not Timer1.Enabled
    Aber:
    Dauern alle Ampelphasen gleich lange :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    r1zzor schrieb:
    "PictureBox1_Click"
    Machst Du da drin


    Aber wenn ich es da rein mache habe ich keine Zeitliche abfolge mehr. Mein Ziel ist es durch einmaligen klick auf PictureBox1 alle Ampelphasen zu starten so das Sie nacheinander ablaufen, bei der letzten enden und bei erneutem klick auf PictureBox1 neustarten...

    RodFromGermany schrieb:

    Aber:
    Dauern alle Ampelphasen gleich lange

    In der Realität natürlich nicht...wahrscheinlich ist das durch deinen Vorschlag umsetzbar. Nur leider bin ich wie gesagt ein Neuling...wäre für mich auch ausreichend, wenn die Phasen gleich laufen...

    r1zzor schrieb:

    VB.NET-Quellcode

    1. Ampel_Status = 0
    Statt dieser Zeile machst Du

    VB.NET-Quellcode

    1. Timer1.Stop()
    und bei Deinem Klick

    VB.NET-Quellcode

    1. Ampel_Status = 0
    2. Timer1.Stop()
    Bei verschieden langen Dauern musst Du natürlich wissen, welcher Zustand zu jedem Zeitpunkt aktiv ist. Jou, das geht mit der von mir vorgeschlagenen Methode.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank RodFromGermany,

    die Ampel bleibt nun stehen nachdem Sie ihre Ampelphasen beendet hat, nur hat der click keine Funktion und die Ampel startet wie gehabt bei Programmstart einmal durch...


    C#-Quellcode

    1. Dim Ampel_Status As Integer = 0
    2. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. Select Case Ampel_Status
    4. Case 0
    5. Rot.Visible = True
    6. Gelb.Visible = False
    7. Grün.Visible = False
    8. Case 1
    9. Rot.Visible = True
    10. Gelb.Visible = True
    11. Grün.Visible = False
    12. Case 2
    13. Rot.Visible = False
    14. Gelb.Visible = False
    15. Grün.Visible = True
    16. Case 3
    17. Rot.Visible = False
    18. Gelb.Visible = True
    19. Grün.Visible = False
    20. Case 4
    21. Rot.Visible = True
    22. Gelb.Visible = False
    23. Grün.Visible = False
    24. Timer1.Stop()
    25. End Select
    26. Ampel_Status += 1
    27. End Sub
    28. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    29. Ampel_Status = 0
    30. Timer1.Stop()
    31. End Sub
    @Vainamo V Da hast Du ja glatt meine C&P-Bremse entdeckt ohne sie gefunden zu haben. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Super, vielen Dank euch Allen...jetzt läuft die Ampel super. Das einzige worum ich mich noch kümmern muss ist:

    Das die Ampel länger auf Grün bleibt und die Ampelphasen erst starten, wenn ich auf das Image klicke und nicht sofort, wenn ich das Programm starte :)

    r1zzor schrieb:

    wenn ich das Programm starte
    Hast Du im Designer den Timer auf Enabled = True stehen? Setze ihn da auf False.
    Startest Du ihn im Form_Load oder so, musst Du diese Zeile rausnehmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!