Wie modelliere ich eine Straßenampelsteuerung?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 169 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Und dann von mir noch ein Wunsch: Wie sieht denn das Datenmodell aus? Will heißen: Zeig mal bitte für den Anfang Deine Ampelklasse.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Habe alles wieder gelöscht.

    Ich habe nun in sehr vielen Beispielen dieses hier gesehen, wobei pb_grün0 usw.. meine PictureBoxen auf der Form sind.

    VB.NET-Quellcode

    1. Dim fussgrünHaupt() As PictureBox
    2. fussgrünHaupt As New PictureBox(){pb_grünf0, pb_grünf1}

    Ich finde nichts dazu warum bei mir ein Fehler kommt. Fehler: Deklaration erwartet...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Das Schlüsselwort As ist Teil der VB-Deklaration-Syntax (zB in Kombination mit Dim - s. Zeile#2).
    Es taucht bei dir zweimal auf - beim zweiten Mal syntax-widrig (nämlich ohne Dim).
    Also der Compiler sieht in zeile#3 das As und erwartet folglich eine Deklaration (Dim, Public, Private, etc). Da ist aber keine.

    Amelie schrieb:

    Ich finde nichts dazu warum bei mir ein Fehler kommt. Fehler: Deklaration erwartet...
    grrr - siehe post#16

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

    Amelie schrieb:

    Habe alles wieder gelöscht.
    Welche Arbeitspakete möchtest Du jetzt abarbeiten?
    Wenn Du keinen detaillierten Plan entwirfst, wirst Du es nicht in einer akzeptablen Zeit schaffen, Dein Projekt zu verwirklichen.
    Ich hatte Dir bereits geschrieben, dass Du zunächst alles mögliche aufschreiben sollst, ohne am Code zu arbeiten.
    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!
    @Amelie Kurz zum Verständnis soll das ganze Projekt nur eine "Fingerübung" sein. Sich mit Pictureboxen, grafischer Anzeige etc. zu beschäftigen? Falls das nur eine Übung ist und Du Schwierigkeiten hast, hilft es immer das Problem erstmal kleiner/einfacher zu machen.
    z.B. Background Picturebox mittels Button click Farbwechsel etc. dann Farbwechsel mit Timer dann ... (oder eben erstmal eine "Ampel" anstatt ganze Kreuzung aufeinmal -> schnelleres Fehlerfinden)
    Langsam kommt man so seinen eigentlichen Zielen auf die Spur.

    Leider ist es immer viel leichter gedacht als dann gemacht. Simpelste Sachen, können doch deutlich komplexere Dinge erfordern als angenommen.
    LG

    ---
    Welches Probleme hast Du jetzt ganz konkret
    codewars.com Rank: 4 kyu

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

    @nogood
    Ja es soll eine Übung sein.

    @RodFromGermany
    Ich hatte doch alles aufgeschrieben was ich mir so vorstellte.
    Habe das alles nun vereinfacht.
    Ein Ample für Autos, eine für Fussgaänger. Autos haben im Betrieb grün, Fusgänger rot. Der Fussgänger kann auf den Anforderungsknopf drücken und bekommt nach eingestellter Zeit grün .. usw... Dazu gibt es noch eine Störrungssimulation welche mittels Button ausgelöst wird.

    Vielleicht kann mir jemand mal in einfachen Worten erklären, wann ich:
    Eine Class hinzufügen soll
    oder
    Ein Modul hinzufügen soll

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Modul: Fast gar nicht.
    Klasse: Bauplan für Objekte, also Objektbeschreibung.

    Bei Dir fängt es also beim Programmieren* (am besten in einer eigenen Datei) mit

    VB.NET-Quellcode

    1. Friend Class Ampel
    2. End Class
    an.

    *was aber erst der Schritt nach dem Überlegen ist, was ne Ampel in Deinem Programm charakterisiert und können muss.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Amelie schrieb:

    Habe das alles nun vereinfacht.
    Dann mach in Version 1 alles ganz einfach, da gehört eine

    Amelie schrieb:

    Störrungssimulation
    noch nicht dazu.
    Arbeitspaket:
    UserControl für eine 3-Farben-Ampel, das im externen Takt nacheinander die richtigen Farben darstellt.
    Der externe Takt wird durch Button_Click erzeugt.
    Wenn Du das hast, reden wir weiter.
    ========
    Ich weiß, Du hast es jetzt sehr schwer. Viele eifrige Helfer wollen Dir helfen, Deinen Plan umzusetzen.
    Dein Problem ist, dass sich die Helfer untereinander nicht einig sind und sich auch nicht absprechen.
    Hier musst Du ansetzen:
    Mach Dir zu jedem Helfer eine Liste, wie er Dir helfen will.
    Dann legst Du fest, wem Du folgen willst.
    Mach dies öffentlich, so dass die anderen Helfer wissen, dass Du ihren Weg nicht verfolgen willst.
    Dann konzentriere Dich auf diesen einen Weg, bei dem Dir dann auch wieder andere Helfer zur Seite stehen.
    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“ ()

    Ok Klassen usw....

    Eine Klasse angelegt ( nicht auf dem fr-main Form ). Warum kann ich nun auf dem frm_main Form die nicht ansprechen?
    Fehler: ampelstatus wurde nicht deklariert?
    Ich dachte in einer Public Class sind die von überall zugänglich? ?( ?(
    Die Klasse:

    VB.NET-Quellcode

    1. Public Class ampel
    2. Private ampelstatus As Boolean = False
    3. Private ampelbetrieb As Boolean = False
    4. Private fussganger As Boolean = False
    5. Public Sub einschalten(einstatus As Integer)
    6. If einstatus = 1 Then
    7. ampelstatus = True ' hier mit MsgBox alles OK!!!


    Auf dem Form

    VB.NET-Quellcode

    1. Private Sub frm_main_shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    2. If ampelstatus = True Then ' Hier Fehler Nicht deklariert?
    3. 'blablalba
    4. End If
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ampelstatus ist Teil der ampel-Klasse. Und dann ist es noch Private deklariert. Daher haben andere Klassen eh keinen Zugriff darauf.
    Aber auch wenn ampelstatus statt Private eben Friend oder Public wäre, dann will der Compiler auch wissen, wovon Du den ampelstatus setzen willst. Du musst erstmal eine Ampel mithilfe von New "konstruieren" (oder anders genannt: eine Ampel instanziieren), damit in Deinem Programm überhaupt erstmal ne tatsächliche Ampel exisitert. Und wenn Du dann 4 Ampeln hast, will der Compiler auch wissen, von welcher Ampel (will heißen: welche Ampel-Instanz) Du konkret den ampelstatus setzen willst.

    ##########
    @Amelie
    Ein Beispiel:

    VB.NET-Quellcode

    1. Private Sub frm_main_shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    2. Dim ErsteAmpel = New Ampel
    3. Dim ZweiteAmpel = New Ampel
    4. ErsteAmpel.ampelstatus = True
    5. ZweiteAmpel.ampelstatus = False
    6. If ErsteAmpel.ampelstatus Then 'das = True kann man weglassen
    7. 'blablabla
    8. End If


    Das setzt voraus, dass ampelstatus von außen zugänglich ist, also nicht mit Private deklariert ist. Gleichzeitig zeigt sich ein Problem in der Variablenbenennung. Was soll ampelstatus = True bedeuten? Was ist denn ein wahrer oder falscher Ampelstatus?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Das ist doch alles irgendwie immer dopeltgemopelt ... ?(
    Ich glaube meine Logik passt nicht zu programmieren.

    Wozu eine solche Sache

    VB.NET-Quellcode

    1. Private ampelstatus As Boolean = True
    machen, wenn ich dann mit dem ( True oder False ) davon so nix anfangen kann ohne da erst nochmal etwas zu deklarieren?

    VB.NET-Quellcode

    1. Public Class hamster
    2. Public käfig As Boolean = True


    Dann ist käfig noch immer nicht erreichbar? Wofür ist dann das Boolean besser gesagt der Zustand des Boolean gut????
    Das ist für meine Logik .... ?(

    Also wieder löschen und neu anfangen...



    @RodFromGermany
    UserControl für eine 3-Farben-Ampel, das im externen Takt nacheinander die richtigen Farben darstellt.Der externe Takt wird durch Button_Click erzeugt.

    Das bekomme ich hin ;)

    @VaporiZed
    Wieder überschnitten....
    Was soll ampelstatus = True bedeuten? Was ist denn ein wahrer oder falscher Ampelstatus?

    Der Ampelsatus sollte anzeigen ob die Anlage läuft oder Störung hat. So hatte ich mir das halt auf meinen Plan geschrieben.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Dann ist käfig noch immer nicht erreichbar? Wofür ist dann das Boolean besser gesagt der Zustand des Boolean gut????

    Wenn käfig wie in Deinem Beispiel mit Public deklariert ist, ist es auch von außen abrufbar. Aber es ist ja auch eine Eigenschaft* des Hamsters.
    Naja, Du willst irgendwas über die Ampel aussagen. Nicht über die Straße, nicht über die Verkehrsteilnehmer. ampelstatus beschreibt einen Teil der Ampel. Und käfig beschreibt … öhm … den Haltungszustand des Hamsters (?) und nicht den einer Katze. Daher gehört käfig in die Klasse Hamster.

    Amelie schrieb:

    Der Ampelsatus sollte anzeigen ob die Anlage läuft oder Störung hat.

    Dann wäre eine passendere Bezeichnung der Variable z.B. FunktioniertNormal. Da kann man was auch mit True oder False verstehen.

    * für die anderen: nicht im Sinne von Property

    ##########

    Aber es stellt sich mir gerade eine andere Frage: Willst Du mit ampelstatus eine Ampel beschreiben oder alle Ampeln gleichzeitig? Wenn Du eher sagen willst, dass alle Ampel ausfallen (oder wieder normal laufen), dann muss man das natürlich anders angehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich glaube ein großes Problem ist das jeder hier andere Begrifflichkeiten hat.

    Ist die Ampel an oder aus? Ist das ein Staus / Zustand?
    Ja was ist die Ampel auf der Strasse / Kreuzung?
    Nur eine "Ampel" oder alle die an dieser Strasse / Kreuzung stehen?

    Ich deklariere es nun so:
    Eine einzige :)
    Bilder
    • simpelampel.jpg

      9,59 kB, 259×194, 235 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    RodFromGermany schrieb:

    Diese kannst Du alle numerieren und für jeden Zustand die Farben aller Ampeln sowie die Dauer festlegen und die Überspringbarkeit.

    Ein Boolean kennt nur zwei Zustände: True und False.
    Du brauchst mehrere definierte Zustände:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Enum AmpelPhasen
    2. Rot
    3. RotGelb
    4. Gruen
    5. GelbGruen
    6. Gelb
    7. Last
    8. End Enum
    9. '...
    10. Dim AmpelPhase As AmpelPhasen = AmpelPhasen.Rot
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. Label1.Text = Me.AmpelPhase.ToString
    13. ' bedeutet: AmpelPhase += 1
    14. AmpelPhase = CType(AmpelPhase + CType(1, AmpelPhasen), AmpelPhasen)
    15. If AmpelPhase = AmpelPhasen.Last Then
    16. AmpelPhase = AmpelPhasen.Rot
    17. End If
    18. End Sub
    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!

    Amelie schrieb:

    Ja was ist die Ampel auf der Strasse / Kreuzung?
    Nur eine "Ampel"
    Ja, das sehe ich auch so. Eine Ampel-Instanz ist genau eine einzige Ampel, so (ähnlich) wie im Bild zu sehen. Und das ist der Knackpunkt. Wenn eine Ampel die Eigenschaft ampelsteuerung hat, wie soll dann das Programm wissen, welche Ampel Du mit

    VB.NET-Quellcode

    1. Private Sub frm_main_shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    2. If ampelstatus = True Then ' Hier Fehler Nicht deklariert?
    3. 'blablalba
    4. End If
    ansteuern willst? Es besteht ja noch nicht mal ein Bezug zu einer Ampel. Daher weiß der Compiler ja noch nicht mal, dass Du die Ampeleigenschaft meinst. Denn lass jetzt mal ne weitere Klasse in Deinem Programm sein:

    VB.NET-Quellcode

    1. Public Class Schaltzentrale
    2. Public ampelsteuerung As Boolean
    3. Public WarmwasserFürAlleHaushalteFunktioniert As Boolean
    4. End Class

    Woher soll dann Dein Programm wissen, dass mit ampelsteuerung = True innerhalb von frm_main_shown jetzt effektiv eine Ampel gemeint ist und nicht die Schaltzentrale? Und wenn Du 8 Ampeln hast, weiß der Compiler auch nicht, bei welcher Ampel Du jetzt den Zustand verändern willst. Das musst Du somit dem Compiler immer mitteilen, indem Du den konkreten Bezug dazuschreibst, so wie ich es in Post#30 mit den 2 Ampeln gemacht habe.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Im Code wird KEIN Fehler angezeigt. Project bereinigt.
    Gestartet und dann auf den Button geklickt. Nach ca 1 sec kommt dieser Fehler.
    Ich scheine echt zu blöd zu sein

    Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in WindowsApplication2.exe aufgetreten.

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Private Sub frm_main_shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    3. End Sub
    4. Private Sub btn_start_Click(sender As Object, e As EventArgs) Handles btn_start.Click
    5. Dim aufruf As New steuerung
    6. aufruf.starten()
    7. End Sub
    8. End Class
    9. Public Class steuerung
    10. Public AutoAmpel1 As New steuerung ' Hier ist es egal ob DIM oder PUBLIC
    11. Public FussAmpel1 As New steuerung
    12. Dim status As Boolean
    13. Public Sub starten()
    14. AutoAmpel1.status = True
    15. frm_main.Label1.Text = AutoAmpel1.ToString
    16. End Sub
    17. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    StackOverflowException = fast immer Rekursion.
    Ablauf bei Dir:
    Dim aufruf As New steuerung -> ein steuerung-Objekt namens aufruf wird erstellt
    Dazu gehört: eine AutoAmpel1 und eine FussAmpel1 (was ist ne Fußampel?)
    Beide sind vom Typ steuerung und werden gleich mit New instanziiert.
    Öhm … ja. Und dann wiederholt sich das. Da AutoAmpel1 selber wieder eine steuerung ist und somit selber wieder eine AutoAmpel1 und eine FussAmpel1 hat und die wieder instanziiert werden …
    Endlosschleife.
    Da stimmt (ja, sorry) was am Datenmodell nicht.
    Außerdem ist es ein no go, dass die Klasse steuerung auf frm_Main zugreift, aber das behandeln wir gleich.
    AutoAmpel1 und FussAmpel1 sind wohl daher nicht vom Typ steuerung, sondern vom Typ … Ampel?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi @Amelie

    so etwa:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. #Disable Warning IDE1006 ' Benennungsstile
    2. Public NotInheritable Class Form1
    3. Public ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
    4. Private S1 As steuerung = Nothing
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. S1 = New steuerung(True, True, 42, 21)
    9. S1.starten()
    10. Debug.WriteLine("bin fertig")
    11. End Sub
    12. End Class
    13. Public Class Grobes
    14. Public Structure _AutoAmpel
    15. Public Property status As Boolean
    16. Public TestInt As Integer
    17. End Structure
    18. Public Structure _FussAmpel
    19. Public Property status As Boolean
    20. Public TestInt As Integer
    21. End Structure
    22. End Class
    23. Public NotInheritable Class steuerung : Inherits Grobes
    24. Public Autoampel As _AutoAmpel
    25. Public FussAmpel As _FussAmpel
    26. Public Sub New(ByVal StatusAutoampel As Boolean, ByVal StatusFussampel As Boolean, ByVal TI1 As Integer, ByVal TI2 As Integer)
    27. Me.Autoampel.status = StatusAutoampel
    28. Me.FussAmpel.status = StatusFussampel
    29. Me.Autoampel.TestInt = TI1
    30. Me.FussAmpel.TestInt = TI2
    31. End Sub
    32. Public Sub starten()
    33. Form1.Label1.Text = Autoampel.ToString() 'warum?
    34. End Sub
    35. End Class
    36. #Enable Warning IDE1006 ' Benennungsstile


    Es geht mir darum, dass du erstmal mit Klassen um kannst.
    Du willst ja nur einmal das komplette Paket
    Steuerung initalisieren. Da muss alles drin sein. Die Fußampeln , die Autoamplen, und jeweils deren Eigenschaften. Daher habe ich "mal eben schnell" ein Testprojekt erstellt. Ich habe die Klasse Form1 (logisch), dann eine Klasse mit Grobzeug (denk dir einen besseren Namen aus). Als dritte Klasse gibt es die Steuerung. Diese erbt von Grobes. Nun habe ich einen Konstruktor gebaut (Public Sub New), mit dem du bestimmte Werte übergeben kannst. Und das war's im Grunde genommen schon.

    Natürlich geht das alles besser und schöner, aber es läuft, kompiliert und du kannst lernen.

    In die
    Public Structures kannst du gerne noch mehr Eigenschaften reintun.

    Bedenke bitte, dass einige Sachen nicht durch den Konstruktor festgelegt werden sollten, genau wie auch gerne einige Sachen Private sein dürfen. Ich will sagen, selbst Funktionen sollten einige Werte nicht ändern können. Aber lass das erstmal sacken.

    PS: Ich habe in den Projekteigenschaften Option Strict auf On gestellt, Option infer auf Off, VB6-Verweis entfernt und die Assembly-Language auf Deutsch (Deutschland) gestellt. Nur dass du Bescheid weißt.

    Bilder
    • Übergabe an den Konstruktor.jpg

      234,45 kB, 1.774×942, 46 mal angesehen
    • alles initialisiert, fertig.jpg

      204,49 kB, 1.487×920, 44 mal angesehen

    Bartosz schrieb:

    Option Strict auf On gestellt, Option infer auf Off,


    Das habe ich Standartmäßig auf ON. ;)

    Danke für dein Code aber ich muss erstmal etwas anderes sacken lassen. Wenn ich etwas weiter bin werde ich den mal gründlich studieren :)
    Ich muss das mit den Klassen und wie man damit umgeht mal richtig verstehen...


    @RodFromGermany
    ​Enum AmpelPhasen
    .
    Gelb
    Last
    End Enum

    Was ist Last??
    ​Dann legst Du fest, wem Du folgen willst.
    Gute Idee
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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