Ampel - Logikproblem

  • VB

  • preview
  • 2267 Aufrufe 17 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ampel - Logikproblem

    Hallo zusammen,

    ich bin gerade dabei, die einfache Ampel in Visual Basic zu programmieren, also 3 Labels für die Ampel und einen Button, der den gesamten Ampelvorgang (Rot -> Rot/Gelb -> Grün -> Gelb -> Rot) "abspielt".
    Dabei soll auf jegliche Timer verzichtet werden.
    Rot zu Rot/Gelb stellt kein Problem dar, wenn ich allerdings grün dazu"programmiere", überspringt er die Rot/Gelb-Phase und springt von Rot direkt auf grün.
    Wie kann die Abfrage so gestalten, dass diese Phase nicht übersprungen (vllt getrennt abfragen?) wird?

    Danke

    preview
  • Du könntest dass ganze doch mit einer einfachen Wenn-Dann Abfrage lösen:

    Wenn Ampel=rot Dann schalt gelb ein
    Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
    Wenn Ampel=grün ...
  • Orcshadow schrieb:

    Du könntest dass ganze doch mit einer einfachen Wenn-Dann Abfrage lösen:

    Wenn Ampel=rot Dann schalt gelb ein
    Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
    Wenn Ampel=grün ...



    Ist so geschehen, bloß verarbeitet der beide Anfragen auf einmal und den Sprung auf Rot/Gelb nimmt man gar nicht wahr, weil er direkt weiter geht zu nur grün.. -.-
  • Orcshadow schrieb:


    Wenn Ampel=rot Dann schalt gelb ein
    Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
    Wenn Ampel=grün ...


    Ist hier nicht das Problem, dass er nach dem ersten Wenn in das zweite Wenn springt, weil das nun auch wahr ist? Also bräuchte man nicht irgendwie ein break, oder return?
    Zumindest ist so klar, warum der Interpreter den Block komplett durchläuft...
  • If l1.BackColor = &HFF& (=rot) Then
    l2.BackColor = &HFFFF& (=gelb)

    Else

    If l2.BackColor = &HFFFF& (=gelb) Then

    If l1.BackColor = &HFF& (=rot) Then l3.BackColor = &HFF00& (=grün): l2.BackColor
    = &HFFFFFF(=weiss): l1.BackColor = &HFFFFFF(=weiss)



    End If

    End If


    Das ist der Quelltext des Buttons.
    Wenn ich das grüne weglasse, springt die Ampel wie gewünscht von rot auf rot/gelb, füge ich ihn ein springt sie von rot direkt auf grün -.- HILFE
  • Sie springt auch mit dem code auch von rot nach rot/gelb nach grün aber eben viel zu schnell zum sehen du musst zwischen die einzelnen zustandsänderungen irgendeine pause reinbringen seis durch ne große schleife oder eben nen timer aber gegen den hast du ja was
    Wenn du zum weibe gehst nimm die Peitsche mit (Nietzsche)
  • Für sowas baust du dir am besten eine ZustandsMaschine..

    hier mal in C

    Quellcode

    1. void ampel (void)
    2. {
    3. static int i=0;
    4. if(i==0)
    5. {
    6. //rot an
    7. i++;
    8. }
    9. if(i==1)
    10. {
    11. //gelb an
    12. i++;
    13. }
    14. if(i==2)
    15. {
    16. //grün an, gelb und rot aus
    17. i++;
    18. }
    19. if(i==3)
    20. {
    21. //grün aus, gelb an
    22. i=0;
    23. }
    24. }
    Alles anzeigen


    static int i -> die Variable behält ihren Wert bei den Durchläufen...
    [SIZE=1]
    Was ist der Unterschied zwischen einem U-Boot und MS Windows?
    Keiner, sobald man ein Fenster aufmacht, fangen die Probleme an
    Alle Tips von mir ohne Gewähr und auf eigenes Risiko !!
    UP1 UP2 UP3[/SIZE][SIZE=1]
    [/SIZE]
  • peter9876 schrieb:

    Sie springt auch mit dem code auch von rot nach rot/gelb nach grün aber eben viel zu schnell zum sehen du musst zwischen die einzelnen zustandsänderungen irgendeine pause reinbringen seis durch ne große schleife oder eben nen timer aber gegen den hast du ja was


    Die Frage ist ja, ob es ohne Timer und mit meinem Model überhaupt geht.
    Denn sonst ist es Zeitverschwendung für euch und für mich :)

    Danke aber an alle, die sich bis jetzt mit dem Problem befasst haben! (und sich hoffentlich auch weiterhin damit befassen)
  • ´hab ich auch in meinen leten 2 posts versucht zu erklären. Du musst irgendwie dafür sorgen das der Pc beim ausführen zwischen den einzelnen stufen ne pause macht ohne timer oder schleife um prozessor beschäftigt zu halten geht das net
    Wenn du zum weibe gehst nimm die Peitsche mit (Nietzsche)
  • Hi!

    Ja, es geht ohne Timer und ohne break-Befehl!

    Ich kenne den ganzen Quelltext nicht daher kann ich dir den Fehler nicht sagen.
    Aber ich schreib dir mal zwei Möglichkeiten auf wie du es machen könntest.
    Du musst dabei aber immer ElseIf schleifen verwenden.
    Sonst könnte es sein, dass der Hintergrund von z.B. l3 gerade grün war, aber danach kam noch die Umschaltung auf rot im Sub.
    Dann würde die Ampel innerhalb eines Klickes zwei mal schalten.
    Hoffe das ist verständlich.

    Also, eine hat DOcean schon beschrieben.

    Das würde in VB6 so aussehen:

    Quellcode

    1. Option Explicit
    2. Dim i as Integer #i als globale Variable festlegen
    3. # l1 = rot
    4. # l2 = gelb
    5. # l3 = grün
    6. Private Sub cmd1_click() # cmd1 heißt der Button
    7. # Bei jedem Klick auf den Button wird abgefragt wie groß i ist.
    8. # Dann wird mit If und ElseIf der Wert von i abgefragt und
    9. #dementsprechend wird die Ampel geschalten.
    10. # Wenn i den Wert 3 erreicht, wird die Variable wieder auf 0
    11. # gesetzt und alles beginnt von Vorne!
    12. If i = 0 then
    13. i = i + 1 #i wird um 1 erhöht
    14. l1.BackColor = vbred
    15. l2.BackColor = vbwhite
    16. l3.BackColor = vbwhite
    17. ElseIf i = 1 then
    18. i = i + 1
    19. l1.Backcolor = vbred
    20. l2.Backcolor = vbyellow
    21. l3.BackColor = vbwhite
    22. ElseIf i = 2 then
    23. i = i + 1
    24. l1.BackColor = vbwhite
    25. l2.BackColor = vbwhite
    26. l3.BackColor = vbgreen
    27. ElseIf i = 3 then
    28. i = 0
    29. l1.BackColor = vbwhite
    30. l2.BackColor = vbyellow
    31. l3.BackColor = vbwhite
    32. End If
    33. End Sub
    34. Private Sub Form_load()
    35. # hier werden die Hintergrundfarben der Labels alle auf weiß gesetzt
    36. l1.vbwhite
    37. l2.vbwhite
    38. l3.vbwhite
    39. End Sub
    Alles anzeigen


    Die Andere Methode wäre die Zustände der Labelhintergründe abzufragen.
    Das sähe dann so aus:

    Quellcode

    1. Option Explicit
    2. Private Sub cmd1_Click() # cmd1 = Name des Button
    3. If l1.BackColor = vbred And l2.BackColor = vbwhite And l3.BackColor = vbwhite then
    4. # wird ausgeführt wenn l1 = rot, l2 = weiß, l3 = weiß ist
    5. l2.BackColor = vbyellow
    6. ElseIf l1.BackColor = vbred And l2.BackColor = vbyellow And l3.BackColor = vbwhite then
    7. # wird ausgeführt wenn l1 = rot, l2 = gelb, l3 = weiß ist
    8. l1.BackColor = vbwhite
    9. l2.BackColor = vbwhite
    10. l3.BackColor = vbgreen
    11. ElseIf l1.Backcolor = vbwhite And l2.BackColor = vbwhite and l3.BackColor = vbgreen then
    12. # wird ausgeführt wenn l1 = weiß, l2 = weiß, l3 = grün ist
    13. l2.BackColor = vbyellow
    14. l3.BackColor = vbwhite
    15. Elseif l1.BackColor = vbwhite And l2.BackColor = vbyellow And l3.BackColor = vbwhite then
    16. # wird ausgeführt wenn l1 = weiß, l2 = gelb, l3 = weiß ist
    17. l1.BackColor = vbred
    18. l2.BackColor = vbwhite
    19. End If
    20. End Sub
    21. Private Sub Form_load()
    22. # das sind die Anfangsbedingungen
    23. l1.BackColor = vbred
    24. l2.BackColro = vbwhite
    25. l3.BackColor = vbwhite
    26. End Sub
    Alles anzeigen


    Ich hoffe das konnte dir helfen.
    Wenn du noch Fragen hast meld dich per PN.

    /edit: Noch ein guter Tipp! vb@rchiv Visual Basic Tipps, Sourcecode, Free-ActiveX, WinAPI (hoffe der link ist genehmigt)


    Mfg Tigga!

    User helfen Usern: die FSB-Tutoren! (Zum Chat) mit den Tutoren
  • Dann müste man aber in einem Affen Tempo auf den Button "hauen"...

    Der Code sorge nur dafür das bei jedem Klick EXAKT ein Phase weitergeschaltet wird....
    [SIZE=1]
    Was ist der Unterschied zwischen einem U-Boot und MS Windows?
    Keiner, sobald man ein Fenster aufmacht, fangen die Probleme an
    Alle Tips von mir ohne Gewähr und auf eigenes Risiko !!
    UP1 UP2 UP3[/SIZE][SIZE=1]
    [/SIZE]
  • @peter9876
    Nein. Es wird immer nur eine Phase weitergeschalten.

    @DOcean
    Das wollte er ja oder?
    Und warum Affentempo?
    Schalten bei dir Ampeln im sekundentakt um? :weglach:

    Mal im ernst.
    Im ganzen Thread hat er nichts von automatischem Umschalten geschrieben.

    Wenns automatisch funktionieren soll, muss er eben einen Timer verwenden.


    Mfg Tigga!

    User helfen Usern: die FSB-Tutoren! (Zum Chat) mit den Tutoren