Projektbeurteilung Ampelsteuerung

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

Es gibt 109 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Projektbeurteilung Ampelsteuerung

    Moin moin zusammen

    Ich tue mich leider immer schwer mit der Namensvergabe, mir fehlt wohl einfach die Übung..??
    -----
    Mache nun noch letzte kleine Änderungen (Namensvergaben etc..) und "Testdurchläufe" an meinem Übungsprojekt und dann zippe ich die Solution mal.
    Wäre dann über jeden weiteren Tip dankbar.



    So hier nun das fertige Übungs/Aufgaben Project
    -----------------
    Vorgabe:
    Haupt und Nebenstraße mit je einer Ampel pro Fahrtrichtung. Die Ampelanlage soll eine umschaltbare Nachtschaltung, welche zeitlich änderbar ist, sowie einstellbare Grünphasen besitzen.
    Zudem soll die Ampelsteuerung eine s.g. Räumphase nach jeder Rotphase erhalten. In fast allen Beispielen werden diese Räumphasen nicht berücksichtigt.
    Die jeweiligen Zustände / Anzeigen sollen in einem Peudo-Display angezeigt werden.
    ;)

    Habe versucht das ganze so gut wie möglich in OOP zu machen und war auch bei der Namensvergabe hoffentlich etwas besser.

    Beiträge zusammengefügt. ~Thunderbolt
    ausgelagert aus Übungsaufgabe FlipFlop ~VaporiZed
    Bilder
    • Ampel-1.jpg

      258,29 kB, 1.176×507, 156 mal angesehen
    Dateien
    • AmpelstV4.zip

      (21,04 kB, 116 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Habe versucht das ganze so gut wie möglich in OOP zu machen
    OOP bedeutet aber objektorientierte Programmierung. Neben der Formklasse hast Du keine einzige eigene. Ob man das als OOP bezeichnen kann? Nuja. Zumindest eine Ampelklasse wäre sinnvoll. Und ggf. eine Kreuzung-Klasse. Aber das jetzt zu machen, ohne den Nutzen zu kennen oder zu sehen, wäre sinnfrei.

    Amelie schrieb:

    und war auch bei der Namensvergabe hoffentlich etwas besser
    Es ist etwas besser. Aber versuch es mal so: probier mal für jede Sub außer EventHandler einen Namen zu finden, der einen Imperativ bildet und den Zweck der Methode abbildet. Und bei Funktions sollte immer auch über den Namen klarwerden, was die Functions inhaltlich zurückgeben.
    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.
    Aber das jetzt zu machen, ohne den Nutzen zu kennen oder zu sehen

    Naja der Nutzen ist für mich das lernen.

    und den Zweck der
    dachte das hätte ich..

    Ich dachte die ListOf usw wären auch OOP.

    Wie sähe denn so eine Ampelklasse / Kreuzungsklasse aus?

    EDIT: 20:10Uhr

    Meinst Du so etwar ???

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. 'Neue Klassen
    5. Class Ampel
    6. Public _LedFarbe As Color
    7. Public _Status As Boolean
    8. Public _Standort As String
    9. End Class
    10. Class Kreuzung
    11. Public _Haupstrasse As String
    12. Public _Nebenstrasse As String
    13. End Class
    14. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Was ich mit Nutzen meinte, ist: Wenn Du nicht weißt, was Dir die Benutzung/Einführung von Klassen für Codeveränderungen, -vor- und -nachteile bringt, weißt Du ja auch gar nicht, wozu Du damit überhaupt anfangen solltest.
    List(Of hat mit OOP nur bedingt was zu tun. Klar, Du nutzt eine Klasseninstanz. Aber es geht bei OOP m.E. um den OOP-Aufbau des eigenen Projektes.
    Dein Edit von 20:10 zeigt einen rudimentären Anfang von OOP, der allerdings schon etwas falsch abbiegt. Die beiden Klassen dürfen nicht innerhalb der Form-Klasse sein. Sie sind ja nicht Bestandteil eines Formulars, sondern Ampel- und Kreuzungs-Baupläne sind ja formularunabhängig.*
    Meine (!) Vorstellung für ein OOP-Konzept:
    Das Form kennt eine Kreuzungskontrollinstanz.**
    Eine Kreuzungskontrollklasse kennt x Ampel-Instanzen und einen Taktgeber.
    Eine Ampelklasse kennt nix von ihrer Umgebung.

    Das Prinzip sollte sein: Der User teilt über Eingaben (Button-Clicks, CheckBoxen) und somit über das Form der Kreuzungskontrolle mit, welchen Zustand diese hat (Nachtbetrieb, eingeschaltet, im Betrieb). Die Kreuzung schaltet entsprechend ihren Taktgeber (ein) und durch seine Takte teilt die Kreuzungskontrolle den Ampeln ihre Farben mit. Die Ampeln reagieren nur darauf, können sonst aber nix.

    Würdest Du diesem Vorschlag zustimmen oder sagst Du: Nein, an dieser oder jener Stelle ist die Realität anders. Oder gar: der vorgeschlagene Aufbau ist komplett an der Wahrheit im Straßenleben vorbeigedacht.

    * ok, in Deutschland vielleicht nicht ;) (Bürokratiewitz)
    ** bei genauer Überlegung ist nicht Class Kreuzung, sondern Class Kreuzungskontrolle oder Class Kreuzungssteuerung besser.
    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.
    Moin moin

    Also ich habe nun eine Klasse erstellt und diese kann ich ansprechen.
    Der Code funktioniert soweit.

    Jetzt meine Frage:
    Wie bekomme ich das mit der ListOf hin, damit das

    VB.NET-Quellcode

    1. LEDSt.LEDName = PB_AnlageLED
    2. St.LED_onof(LEDSt.LEDName, True)

    einfacher wird? Ist ja auch später für die Ampel wichtig.
    Da bekomme ich in der ListOf den Fehler:
    Fehler 1 Der Wert vom Typ "System.Windows.Forms.PictureBox" kann nicht in "AmpelOOP.SteuerLED" konvertiert werden.



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. Private LEDFarbe As Color
    3. Private Status As Boolean
    4. Public LEDName As PictureBox
    5. Public Sub LED_onof(ByVal Name As PictureBox, Status As Boolean)
    6. If Status Then
    7. LEDFarbe = Color.Lime
    8. LEDName.BackColor = LEDFarbe
    9. Else
    10. LEDFarbe = Color.Green
    11. LEDName.BackColor = LEDFarbe
    12. End If
    13. End Sub
    14. End Class


    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim HSAmpel As New Ampeln
    3. Dim Strasse As New Kreuzungsteuerung
    4. Dim Anlage_ein As Boolean
    5. Dim Betrieb_ein As Boolean
    6. Private LEDSt As New SteuerLED
    7. 'Private LEDSt As List(Of SteuerLED) = Nothing
    8. 'Private Sub PrepareSteuerLeds()
    9. ' LEDSt = New List(Of SteuerLED) From {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt}
    10. 'End Sub
    11. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. End Sub
    13. #Region "Steuerelemente"
    14. Private Sub btn_anlageonoff_Click(sender As Object, e As EventArgs) Handles btn_anlageonoff.Click
    15. If Not TimerTaktgeber.Enabled Then
    16. Anlageausgeschaltet()
    17. Else
    18. Anlageeingeschaltet()
    19. End If
    20. End Sub
    21. #End Region
    22. Private Sub Anlageausgeschaltet()
    23. btn_anlageonoff.Text = "Anlage aus"
    24. lbl_uhrzeit.ForeColor = Color.Lime
    25. lbl_beschriftung.ForeColor = Color.Lime
    26. Betrieb_ein = True
    27. LEDSt.LEDName = PB_Anlage
    28. LEDSt.LED_onof(LEDSt.LEDName, True)
    29. TimerTaktgeber.Start()
    30. End Sub
    31. Private Sub Anlageeingeschaltet()
    32. btn_anlageonoff.Text = "Anlage ein"
    33. lbl_uhrzeit.ForeColor = Color.Green
    34. lbl_beschriftung.ForeColor = Color.Green
    35. lbl_uhrzeit.Text = "00:00:00"
    36. Betrieb_ein = False
    37. LEDSt.LEDName = PB_Anlage
    38. LEDSt.LED_onof(LEDSt.LEDName, False)
    39. TimerTaktgeber.Stop()
    40. End Sub
    41. #Region "Taktung"
    42. Private Sub TimerTaktgeber_Tick(sender As Object, e As EventArgs) Handles TimerTaktgeber.Tick
    43. lbl_uhrzeit.Text = DateTime.Now.ToLongTimeString
    44. End Sub
    45. #End Region
    46. End Class
    47. Public Class Ampeln
    48. Private _LEDFarbe As Color
    49. Private _Status As Boolean
    50. Private _Standort As String
    51. Private _Anzahl As Integer '<====Unsicher ob gebraucht wird
    52. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    LEDSt = New List(Of SteuerLED) From {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt} erzeugt eine SteuerLED-Liste aus einem PicBoxArray. Das geht offensichtlich nicht. Eine Gruppe von PicBoxen ist nunmal keine Gruppe von SteuerLEDs.
    Du willst ja eine Gruppe von SteuerLEDs erzeugen, bei denen dann jeweils eine PicBox ein Bestandteil einer SteuerLED ist.
    Das geht z.B. so:

    VB.NET-Quellcode

    1. Private LEDSt As List(Of SteuerLED) = Nothing
    2. Private Sub PrepareSteuerLeds()
    3. For Each PicBox in LEDSt = {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt} 'nimm je eine PicBox pro Schleifendurchgang aus dem PicBox-Array …
    4. Dim NeueSteuerLED = New SteuerLED With {.LEDname = PicBox} '…und erstelle mithilfe der Schleifendurchgangs-PicBox eine neue SteuerLED-Instanz …
    5. LEDSt.Add(NeueSteuerLED) '…und füge der Liste diese neue SteuerLED-Instanz hinzu
    6. Next
    7. End Sub

    Deine Zeile#7 muss natürlich entfernt werden, sonst gibt's ne Doppelbedeutung von LEDSt.

    Und wieder Namen: Wenn die Abkürzungen für Dich in Deinem Arbeitsumfeld gängige Abkürzungen sind, ist es ok. Ich aber hätte Probleme mit LEDSt und HSAmpel. Warum der Geiz? Benenn das Zeug ruhig ausführlich. Und wenn die Namen 30 Zeichen lang sind. Hauptsache, Du weißt ohne groß nachzudenken, wofür eine Variable ist. Wenn Dir später ein kürzerer oder passenderer Name einfällt, lässt sich solch ein Name einfach ändern. Aber kurze Abkürzungen zu haben, nur weil sie kurz sind, bringen Dir keinen Mehrwert.
    Und LEDname? Was hat ne PicBox mit einem Namen zu tun ?(
    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.
    Fehler in Zeile 4 von Deinem Code-Ausschnitt.
    Fehler 1 Der =-Operator ist für die Typen "System.Collections.Generic.List(Of AmpelOOP.SteuerLED)" und "1-dimensionales Array von System.Windows.Forms.PictureBox" nicht definiert.

    ​Und LEDname? Was hat ne PicBox mit einem Namen zu tun Verstehe diese Frage nicht.
    Für die Sub in der Klasse muss ich doch irgendwie einen Namen übergeben?? Und das ist doch der : PB_Anlage
    OK die Namen überarbeite ich nochmal.

    ​Deine Zeile#7 muss natürlich entfernt Ja das war mir Bewusst ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Bezüglich Zeile#4: korrekt wäre dann wohl For Each PicBox in {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt} :rolleyes:

    Amelie schrieb:

    Verstehe diese Frage nicht.
    Die Variable heißt LEDname und ist vom Typ PictureBox. Warum heißt die Variable LEDname, wenn in ihr kein Name, sondern eine PictureBox steckt? Ich hätte bei der Benennung erwartet, dass die Variable vom Typ String ist und da z.B. drinsteht: "Ampel auf der Hauptstraße, stadteinwärts" oder "Ampel Nr. 3". Dass da aber kein String, sondern eine PicBox drinsteckt, kommt für mich überraschend. Wenn es für Dich aber sonnenklar ist, dass da ne PicBox drinsteckt, dann belass es dabei.
    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.
    Überarbeitung.
    Bei der Ampel-Klasse überlege ich noch wie genau ich die ausführen muss.
    Standort: Haup / Neben Strasse ... Status: für jede Farbe ein Status?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. Public LEDPicBox As PictureBox
    3. Private Farbe As Color
    4. Private Status As Boolean
    5. Public Sub LED_onof(ByVal PicBox As PictureBox, Status As Boolean)
    6. If Status Then
    7. Farbe = Color.Lime
    8. LEDPicBox.BackColor = Farbe
    9. Else
    10. Farbe = Color.DarkGreen
    11. LEDPicBox.BackColor = Farbe
    12. End If
    13. End Sub
    14. End Class


    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim Ampel As New Ampeln
    3. Dim Strasse As New Kreuzungsteuerung
    4. Dim Anlage_ein As Boolean
    5. Dim Betrieb_ein As Boolean
    6. Dim SteuerLED As New SteuerLED
    7. Private LEDAnzeigen As List(Of SteuerLED) = Nothing
    8. Private Sub PrepareSteuerLeds()
    9. For Each PicBox In {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt}
    10. Dim NeueSteuerLED = New SteuerLED With {.LEDPicBox = PicBox}
    11. LEDAnzeigen.Add(NeueSteuerLED)
    12. Next
    13. End Sub
    14. Private Sub btn_betriebonof_Click(sender As Object, e As EventArgs) Handles btn_betriebonof.Click
    15. If Not Betrieb_ein Then
    16. Betrieb_ein = True
    17. SteuerLED.LEDPicBox = PB_Betrieb
    18. SteuerLED.LED_onof(PB_Betrieb, True)
    19. Else
    20. Betrieb_ein = False
    21. SteuerLED.LEDPicBox = PB_Betrieb
    22. SteuerLED.LED_onof(PB_Betrieb, False)
    23. End If
    24. End Sub
    25. End Class


    VB.NET-Quellcode

    1. Public Class Ampeln
    2. Public LEDPicBox As PictureBox
    3. Private Farbe As Color
    4. Private Status As Boolean
    5. Private Standort As String
    6. Public Sub Ampelstatus(ByVal PicBox As PictureBox)
    7. 'ToDo ÜBERLEGEN ....
    8. End Sub
    9. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Na mal langsam. Eine Klasse sollte im Singular benannt werden, wenn sie genau ein Objekt modellieren soll. Daher sollte die zuletzt genannte Klasse Ampel heißen, nicht Ampeln. Die Klasse soll ja eine Ampel darstellen, nicht alle. Korrekt?
    Meines Erachtens sollte die Ampel gar keine PicBoxen enthalten. Die Darstellung von Irgendwas sollte normalerweise im Form stattfinden. Stell Dir vor, dass Du keine PicBoxen mehr zur Anzeige verwenden willst, sondern direkt auf's Form zeichnen willst. Dann hast Du PicBoxen in Deinen Klassen am Hals, die Dich jetzt behindern. Die Klassen außer frm_main sollten daher keine Controls wie PicBoxen enthalten. Sondern nur die relevanten Eigenschaften einer echten Ampel/"Lichtsignalanlage". Und keine mir bekannte Ampel hat sowas wie ne PicBox. Was Du natürlich machen kannst, ist, dass die Ampel Objektinstanzen der noch nicht vorhandenen Klasse LED enthält. Dann kannst Du auch später Fußgängerampeln, Links- und Rechtsabbiegerpfeilampel etc. modellieren.
    Public Sub Ampelstatus -> Benennungsregel einer Sub :rolleyes: .

    VaporiZed schrieb:

    probier mal für jede Sub außer EventHandler einen Namen zu finden, der einen Imperativ bildet und den Zweck der Methode abbildet.

    Eben weil Du die Sub nicht gut benannt hast, weißt Du natürlich auch selber nicht, was sie tun soll. Und damit, was in die Sub rein soll.


    VB.NET-Quellcode

    1. Public Sub LED_onof(ByVal PicBox As PictureBox, Status As Boolean)
    2. If Status Then
    hier sogar 2 Probleme: Sub-Name und Variable Status. If Status Then ist für den Leser erstmal nicht erklärbar. Er muss den Aufruf und den weiteren Code anschauen, um zu erkennen, welche Aufgabe die Variable Status hat.

    ##########

    Wie es weitergeht, ist schwierig. Du kannst weiter an dem Projekt basteln und posten und wir versuchen es zu formen. Das kann dauern. Oder jemand setzt einen Gegenvorschlag auf und Du versuchst ihn nachzuvollziehen. Was aber auch nicht zwangsläufig hilfreich ist, wenn Du den Weg der Erstellung des Gegenvorschlags nicht Schritt-für-Schritt nachvollziehen kannst. Vielleicht hat ein anderer Leser noch einen Vorschlag.
    Mach auf jeden Fall erstmal ein Backup der Post#1-Solution. Das funktioniert ja schon mal.
    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“ ()

    Besser so? ;)

    VB.NET-Quellcode

    1. Public Sub LED_Einschalten(ByVal PicBox As PictureBox, LED_EinAus As Boolean)
    2. If LED_EinAus Then


    Klasse Ampel / Ampeln: Du meinst für jede Ampel ( Lichterkasten mit 3 Lampen ) eine eigene Klasse?

    ​Meines Erachtens sollte die Ampel gar keine PicBoxen enthalten. ... Sondern nur die relevanten Eigenschaften einer echten Ampel/"Lichtsignalanlage".

    Das habe ich nicht verstanden was du meinst.

    ​Wie es weitergeht

    Naja ich habe z.B. auf YT etliche solcher Steuerungen gesehen. Leider alle sehr sehr simpel, und fern ab von reellen Ampelanlagen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Du meinst für jede Ampel ( Lichterkasten mit 3 Lampen ) eine eigene Klasse
    Nein. Eine Klasse für alle Ampeln. Und ob da 1 oder 2 oder 3 Lichterkästen sind, könntest Du innerhalb der Ampelklasse selber festlegen:

    zum Beispiel:

    VB.NET-Quellcode

    1. Friend Class Ampel
    2. ReadOnly Property Lichterkästen As New List(Of Lichterkasten)
    3. Friend Sub New(AnzahlDerLichterkästen As Integer)
    4. For i = 0 To AnzahlDerLichterkästen - 1
    5. Lichterkästen.Add(New Lichterkasten)
    6. Next
    7. End Sub
    8. '…
    9. End Class
    10. Friend Class Licherkasten
    11. Property Farbe As Color
    12. End Class


    Ich habe gemeint: Pack in die Ampelklasse alle Eigenschaften einer echten Straßenampel, die Du für Dein Programm brauchst. Eine reale Ampel hat viele Eigenschaften, zum Beispiel: Anzahl der Lichterkästen, Größe, durchschnittlicher Stromverbrauch, Standortname, Hersteller, Baujahr, nächster Wartungstermin, …
    Wenn Du davon aber nur für Dein Programm Anzahl der Lichterkästen und Standortname brauchst, dann pack auch nur diese Daten als Variablen in Deine Ampelklasse. Aber eben keine Controls (Labels, TextBoxen, PictureBoxen).
    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.
    Muss das mal sacken lassen und das Beispiel versuchen nach zu vollziehen.
    Ich brauch eigentlich nur: Standort also je Strasse ( Haupt & NebenStr. ) 2 Lichterkästen mit je 3 Lichtern
    Erweitern kann man das ja noch immer.

    Muss ich denn das ( die Anzeigen siehe Bild ) dann auch anders machen oder ??

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. Public LEDPicBox As PictureBox
    3. Private Farbe As Color
    4. Private LED_EinAus As Boolean
    5. Public Sub LED_Einschalten(ByVal PicBox As PictureBox, LED_EinAus As Boolean)
    6. If LED_EinAus Then
    7. Farbe = Color.Lime
    8. LEDPicBox.BackColor = Farbe
    9. Else
    10. Farbe = Color.DarkGreen
    11. LEDPicBox.BackColor = Farbe
    12. End If
    13. End Sub
    14. Public Sub LED_Taktung(ByVal PicBox As PictureBox, LED_EinAus As Boolean)
    15. If LED_EinAus Then
    16. Farbe = Color.Yellow
    17. LEDPicBox.BackColor = Farbe
    18. Else
    19. Farbe = Color.SaddleBrown
    20. LEDPicBox.BackColor = Farbe
    21. End If
    22. End Sub
    23. End Class
    Bilder
    • Ampel-2.jpg

      42,89 kB, 262×151, 569 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Erweitern kann man das ja noch immer.
    Und mit guter OOP ist das später ziemlich leicht.

    Amelie schrieb:

    Muss ich denn das […] dann auch anders machen
    Nun, das Form sollte sich die Zustände der Einzel-LEDs von der Kreuzungssteuerung holen können, damit es die PicBoxen entsprechend färben kann.
    Benennung: LED_EinAus As Boolean ist minimal besser. Aber wenn Du LED_EinAus = True hast, ist die LED dann an oder aus? Benennungs-Gegenvorschlag: LedIstEingeschaltet. Dann weiß man sofort, was da True und False bedeutet.
    Deine beiden zuletzt genannten Subs machen effektiv das gleiche. Man kann sie also zusammenfassen. Die erste Sub ist gut benannt. Aber noch nicht perfekt. Wenn der Parameter LED_EinAus auf False ist, wird dann die LED ausgeschaltet oder einfach nur nicht eingeschaltet? Ich kann es dem Code entnehmen. Aber das sollte nicht nötig sein, um es zu wissen. Bei der zweiten Sub fehlt das Verb. Wie wäre es mit LedUmschalten? Du hast bei beiden Subs einen Parameter LED_EinAus drin. Zum Namen hab ich grad was gesagt. Aber welche Bedeutung hat eigentlich das Feld (die Klassenvariable) LED_EinAus, wenn Du sie weder ausliest noch einen Wert setzt?
    Die PicBox gehört wieder nicht in die Klasse SteuerLED. Das Form kann sich von der SteuerLED-Instanz die Farbe holen und die entsprechende PicBox selber einfärben.
    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.
    Teils verstanden, Teils völlig durcheinander.
    Wie komme ich denn nun wieder an die Farbe?

    Habe nun noch etliche Tutorials angesehen (alle reden immer von Autos.. Copy&Paste bei YT ;) ) aber hilfreich ist das nicht wirklich.

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. Public LEDPicBox As PictureBox
    3. Private Farbe As Color
    4. Private LED_eingeschaltet As Boolean
    5. Public Sub LED_Einschalten(ByVal LED_eingeschaltet As Boolean)
    6. If LED_eingeschaltet Then
    7. Farbe = Color.Lime
    8. Else
    9. Farbe = Color.DarkGreen
    10. End If
    11. End Sub
    12. End Class
    13. Class Form
    14. Private Sub btn_anlageonoff_Click(sender As Object, e As EventArgs) Handles btn_anlageonoff.Click
    15. If Not Anlage_ein Then
    16. Anlage_ein = True
    17. PB_Anlage.BackColor = ???????? ' Hier muss ich doch der Klasse Mitteilen das LED Eingeschaltet (True)??
    18. Anlageeingeschaltet()
    19. Else
    20. Anlage_ein = False
    21. PB_Anlage.BackColor = ????????
    22. Anlageausgeschaltet()
    23. End If
    24. End Sub
    25. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Hier muss ich doch der Klasse Mitteilen das LED Eingeschaltet
    Nuja, der einfache Weg:

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. 'Public LEDPicBox As PictureBox
    3. Property Farbe As Color 'dann kann man von außen darauf zugreifen
    4. 'Private LED_eingeschaltet As Boolean
    5. Public Sub LED_Einschalten(ByVal LED_eingeschaltet As Boolean)
    6. If LED_eingeschaltet Then
    7. Farbe = Color.Lime
    8. Else
    9. Farbe = Color.DarkGreen
    10. End If
    11. End Sub
    12. End Class
    13. Class Form
    14. Private EineSteuerLED As New SteuerLED
    15. Private Sub From_Load(sender As Object, e As EventArgs) Handles Me.Load
    16. EineSteuerLED.LED_Einschalten(True) 'oder auch False zum Testen
    17. End Sub
    18. Private Sub btn_anlageonoff_Click(sender As Object, e As EventArgs) Handles btn_anlageonoff.Click
    19. If Not Anlage_ein Then
    20. Anlage_ein = True
    21. PB_Anlage.BackColor = EineSteuerLED.Farbe 'Form holt sich die Farbe von der SteuerLED
    22. Anlageeingeschaltet()
    23. Else
    24. Anlage_ein = False
    25. PB_Anlage.BackColor = EineSteuerLED.Farbe 'Form holt sich die Farbe von der SteuerLED
    26. Anlageausgeschaltet()
    27. End If
    28. End Sub
    29. End Class

    Jetzt siehst Du, dass in beiden Teilen der If-Abfrage für die PB-BackColor der gleiche Code steht. Und daher ist es für die PB-BackColor an dieser Stelle egal, wie der Anlagenzustand ist. Denn die Logik dafür ist nicht mehr im Form-Klassencode, sondern im Code der SteuerLED. Und da ist er besser aufgehoben als im Form-Code. Denn das Verhalten einer Klasse sollte in der Klasse stattfinden, nicht außerhalb. Im Formcode muss für die PB-BackColor nicht mehr geschaut werden, wie der Anlagenzustand ist. Das weiß die Anlage/SteuerLED ja selbst. Das Form holt sich einfach die aktuell aktive Farbe aus der SteuerLED-Klasse. So sollte es auch mit Anlage_ein sein. Nicht in der Formklasse soll entschieden werden, ob das Ding eingeschaltet ist, sondern der Benutzer teilt es der Anlage mit*, indem er einen Button klickt und das Form diese Benutzereingabe an die Anlage weiterreicht. Und die Anlage kümmert sich um die Details. Also z.B.:

    VB.NET-Quellcode

    1. Public Class SteuerLED
    2. Property Farbe As Color = Color.DarkGreen
    3. Private IstEingeschaltet As Boolean = False 'das ist also der Startzustand: eingeschaltet = False
    4. Friend Sub SchalteUm()
    5. IstEingeschaltet = Not IstEingeschaltet
    6. 'entweder
    7. If IstEingeschaltet Then
    8. Farbe = Color.Lime
    9. Else
    10. Farbe = Color.DarkGreen
    11. End If
    12. 'oder in Kurz:
    13. 'Farbe = If(IstEingeschaltet, Color.Lime, Color.DarkGreen)
    14. End Sub
    15. End Class
    16. Public Class frm_main
    17. Private ReadOnly Anlage As New Anlage 'ich vermute mal, dass SteuerLED und Anlage das gleiche sind
    18. Private Sub btn_AnlageUmschalten_Click(sender As Object, e As EventArgs) Handles btn_AnlageUmschalten.Click 'ACHTUNG: ich hab den Button umbenannt
    19. Anlage.SchalteUm()
    20. PB_Anlage.BackColor = Anlage.Farbe
    21. End Sub
    22. '…
    23. End Class


    * ist die Anlage eigentlich die SteuerLED? Ich geh mal davon aus, dass es so ist, ansonsten solltest Du eine zusätzliche Anlage-Klasse anlegen.
    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 3 mal editiert, zuletzt von „VaporiZed“ ()

    Moin moin

    Soweit so gut.

    VB.NET-Quellcode

    1. PB_Anlage.BackColor = EineSteuerLED.Farbe 'Form holt sich die Farbe von der SteuerLED

    Das hatte ich so auch schon aber ich bekam ein Fehler, das Farbe nicht zugänglich sei.
    Weil das wohl auf Private stand.

    VB.NET-Quellcode

    1. Private Farbe As Color


    Werde nun noch etwas mit dem Code "spielen" um alles zu verstehen.


    EDIT 16:45
    @VaporiZed

    Kann es sein das ein OOP-Code wesentlich umfangreicher wird?
    Habe das Steuerteil der Anlage nun fertig und es erscheint mir soooooooviel Code ?(
    Bilder
    • Ampel-2oop.jpg

      66,73 kB, 231×315, 209 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Kann es sein das ein OOP-Code wesentlich umfangreicher wird?

    Mein Diagramm im Anhang zeigt Dir, was Du erwarten kannst, wenn Du ohne OOP arbeitest und wie mit guter OOP. Wenn Du Dein Projekt aus Post#1 mit bisherigen Methoden erweitern willst und Fußgängerampeln, Sonderfälle, mehrere Straßen etc. hinzufügen willst, wirst Du m.E. bei der roten Linie enden. Das kenn ich zumindest aus eigenen Projekten. Hunderte von Codezeilen und immer weniger Durchblick. Die grüne Kurve im im Optimalfall zu erwarten, wenn Du gute OOP anwendest. Ja, zum Anfang ist es mehr Aufwand und auch Codezeilen. Aber der Aufwand rentiert sich, je größer das Projekt wird. Wie schon geschrieben: Wenn der Post#1-Projektumfang alles ist und nichts mehr dazukommen soll, belass es dabei. Aber wenn Du OOP lernen willst und das Projekt noch nicht fertig ist, lohnt es sich, tiefer in den Kaninchenbau vorzudringen, wie man so sagt. Also den OOP-Weg weiterzugehen.

    Aber Moment!

    Amelie schrieb:

    Habe das Steuerteil der Anlage nun fertig und es erscheint mir soooooooviel Code
    Vielleicht solltest Du mal das bisherige posten. Vielleicht ist da nochmal aufräumen angesagt.
    Bilder
    • Diagramm.png

      20,2 kB, 596×441, 129 mal angesehen
    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.
    Moin moin
    Klar möchte ich das OOP lernen, mir kam nur die Frage während des coden auf, das es soviel mehr Codezeilen sind. Vielleicht habe ich aber auch einfach noch zu wenig Erfahrung und vieles unnütze zusammengeschrieben.
    Ich schreibe den Code so wie ich mit " meiner Logik denke ".


    Spoiler anzeigen

    Die Klasse:

    VB.NET-Quellcode

    1. Public Class clAnlage
    2. 'Jedes Objekt hat einen Zustand.
    3. 'Jedes Objekt zeigt ein Verhalten.
    4. 'Jedes Objekt hat eine Identität.
    5. Property Farbe2 As Color = Color.SaddleBrown
    6. Property Farbe As Color = Color.DarkGreen
    7. Property Beschriftungen As String
    8. Private IstEingeschaltet As Boolean = False
    9. Private IstNachtbetrieb As Boolean = False
    10. Private IstBetrieb As Boolean = False
    11. Private IstBlinker As Boolean = False
    12. Friend Sub SchalteEinAus()
    13. IstEingeschaltet = Not IstEingeschaltet
    14. Farbe = If(IstEingeschaltet, Color.Lime, Color.DarkGreen)
    15. Beschriftungen = If(IstEingeschaltet, "Anlage Aus", "Anlage Ein")
    16. End Sub
    17. Friend Sub BetriebEinAus()
    18. IstBetrieb = Not IstBetrieb
    19. Farbe = If(IstBetrieb, Color.Lime, Color.DarkGreen)
    20. Beschriftungen = If(IstBetrieb, "Betrieb Aus", "Betrieb Ein")
    21. End Sub
    22. Friend Sub NachtbetriebEinAus()
    23. IstNachtbetrieb = Not IstNachtbetrieb
    24. Farbe = If(IstNachtbetrieb, Color.Lime, Color.DarkGreen)
    25. End Sub
    26. Friend Sub TaktEinAus()
    27. IstBlinker = Not IstBlinker
    28. Farbe = If(IstBlinker, Color.Yellow, Color.SaddleBrown)
    29. End Sub
    30. End Class


    Das Form:

    VB.NET-Quellcode

    1. Public Class frm_anlage
    2. #Region "Einstellungen"
    3. Private ReadOnly Anlage As New clAnlage
    4. Dim AnlageEin As Boolean = False
    5. Dim Nachtbetrieb As Boolean = False
    6. Dim Betrieb As Boolean = False
    7. Private LEDsAnlage As List(Of PictureBox) = Nothing
    8. Private Sub PrepareLedsAnlage()
    9. LEDsAnlage = New List(Of PictureBox) From {PB_Anlage, PB_Betrieb, PB_Nacht, PB_Takt}
    10. End Sub
    11. Private Sub Combosfuellen()
    12. For I = 0 To 23
    13. Dim Zeiten = Date.Today.AddHours(I).ToString("HH:mm")
    14. CmB_Starttime.Items.Add(Zeiten)
    15. Cmb_Endtime.Items.Add(Zeiten)
    16. Next
    17. CmB_Starttime.SelectedItem = "22:00"
    18. CmB_Endtime.SelectedItem = "06:00"
    19. ChB_Nachtbetrieb.Checked = False
    20. ChB_Nachtbetrieb.Enabled = False
    21. End Sub
    22. #End Region
    23. Private Sub frm_anlage_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    24. PrepareLedsAnlage() : Combosfuellen()
    25. End Sub
    26. #Region "Taktung"
    27. Private Sub TimerTaktgeber_Tick(sender As Object, e As EventArgs) Handles TimerTaktgeber.Tick
    28. Uhrzeit_Takt()
    29. 'ToDo für Lichterkästen
    30. End Sub
    31. #End Region
    32. #Region "Anzeige Lichterkästen"
    33. 'ToDo für Lichterkästen
    34. #End Region
    35. #Region "Anzeigen Anlage"
    36. Private Sub LED_PanelEinAus()
    37. For Each lbl As Label In PN_LED_Anzeigen.Controls.OfType(Of Label)()
    38. lbl.ForeColor = Anlage.Farbe
    39. Next
    40. lbl_Uhrzeit.Text = "00:00:00"
    41. LEDsAnlage.Item(3).BackColor = Anlage.Farbe2
    42. LEDsAnlage.Item(2).BackColor = Anlage.Farbe
    43. End Sub
    44. Private Sub Uhrzeit_Takt()
    45. lbl_Uhrzeit.Text = DateTime.Now.ToString '.ToLongTimeString
    46. Anlage.TaktEinAus()
    47. LEDsAnlage.Item(3).BackColor = Anlage.Farbe
    48. End Sub
    49. Private Sub Nachtmodus()
    50. If Not Nachtbetrieb Then
    51. Anlage.NachtbetriebEinAus()
    52. LEDsAnlage.Item(2).BackColor = Anlage.Farbe
    53. Nachtanzeigen()
    54. Else
    55. Anlage.NachtbetriebEinAus()
    56. LEDsAnlage.Item(2).BackColor = Anlage.Farbe
    57. Nachtanzeigen()
    58. End If
    59. End Sub
    60. Private Sub Nachtanzeigen()
    61. If Not Nachtbetrieb Then
    62. lbl_nachtdauer.Text = "24 Std. Betrieb "
    63. Else
    64. lbl_nachtdauer.Text = "Nachtbetrieb: " & CmB_Starttime.SelectedItem.ToString & " -- " & CmB_Endtime.SelectedItem.ToString & " Uhr"
    65. End If
    66. End Sub
    67. #End Region
    68. #Region "Steuerung"
    69. Private Sub ChB_Nachtbetrieb_CheckedChanged(sender As Object, e As EventArgs) Handles ChB_Nachtbetrieb.CheckedChanged
    70. Nachtbetrieb = Not Nachtbetrieb : Nachtmodus() : Nachtanzeigen()
    71. End Sub
    72. Private Sub btn_AnlageEinAus_Click(sender As Object, e As EventArgs) Handles btn_AnlageEinAus.Click
    73. If Not TimerTaktgeber.Enabled Then
    74. Anlage.SchalteEinAus()
    75. btn_AnlageEinAus.Text = Anlage.Beschriftungen
    76. Anlageeingeschaltet(False)
    77. Else
    78. Anlage.SchalteEinAus()
    79. btn_AnlageEinAus.Text = Anlage.Beschriftungen
    80. Anlageeingeschaltet(True)
    81. End If
    82. End Sub
    83. Private Sub btn_BetriebEinAus_Click(sender As Object, e As EventArgs) Handles btn_BetriebEinAus.Click
    84. If Not Betrieb Then
    85. Anlage.BetriebEinAus()
    86. LEDsAnlage.Item(1).BackColor = Anlage.Farbe
    87. btn_BetriebEinAus.Text = Anlage.Beschriftungen
    88. Betrieb = True
    89. CmB_Endtime.Enabled = False
    90. CmB_Starttime.Enabled = False
    91. Nachtanzeigen()
    92. 'ToDo für Lichterkästen
    93. Else
    94. Anlage.BetriebEinAus()
    95. LEDsAnlage.Item(1).BackColor = Anlage.Farbe
    96. btn_BetriebEinAus.Text = Anlage.Beschriftungen
    97. Betrieb = False
    98. CmB_Endtime.Enabled = True
    99. CmB_Starttime.Enabled = True
    100. Nachtanzeigen()
    101. 'ToDo für Lichterkästen
    102. End If
    103. End Sub
    104. Private Sub Anlageeingeschaltet(ByVal AnlageEin As Boolean)
    105. If Not AnlageEin Then
    106. TimerTaktgeber.Start()
    107. LED_PanelEinAus()
    108. btn_BetriebEinAus.Enabled = True
    109. LEDsAnlage.Item(0).BackColor = Anlage.Farbe
    110. ChB_Nachtbetrieb.Enabled = True
    111. ChB_Nachtbetrieb.Checked = True
    112. Else
    113. TimerTaktgeber.Stop()
    114. LED_PanelEinAus()
    115. btn_BetriebEinAus.Enabled = False
    116. LEDsAnlage.Item(0).BackColor = Anlage.Farbe
    117. ChB_Nachtbetrieb.Enabled = False
    118. End If
    119. End Sub
    120. #End Region
    121. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    VB.NET-Quellcode

    1. Private Sub Nachtmodus()
    2. If Not Nachtbetrieb Then
    3. Anlage.NachtbetriebEinAus()
    4. LEDsAnlage.Item(2).BackColor = Anlage.Farbe
    5. Nachtanzeigen()
    6. Else
    7. Anlage.NachtbetriebEinAus()
    8. LEDsAnlage.Item(2).BackColor = Anlage.Farbe
    9. Nachtanzeigen()
    10. End If
    11. End Sub

    Die If-Abfrage ist an der Stelle unnötig, weil du in beiden Fällen das selbe machst.


    Amelie schrieb:

    VB.NET-Quellcode

    1. Private Sub btn_AnlageEinAus_Click(sender As Object, e As EventArgs) Handles btn_AnlageEinAus.Click
    2. If Not TimerTaktgeber.Enabled Then
    3. Anlage.SchalteEinAus()
    4. btn_AnlageEinAus.Text = Anlage.Beschriftungen
    5. Anlageeingeschaltet(False)
    6. Else
    7. Anlage.SchalteEinAus()
    8. btn_AnlageEinAus.Text = Anlage.Beschriftungen
    9. Anlageeingeschaltet(True)
    10. End If
    11. End Sub

    Auch hier kannst du dir die Abfrage sparen, da wieder das selbe gemacht wird, außer bei Anlageeingeschaltet(True bzw. False)
    Hier könntest du sowas machen

    VB.NET-Quellcode

    1. Private Sub btn_AnlageEinAus_Click(sender As Object, e As EventArgs) Handles btn_AnlageEinAus.Click
    2. Anlage.SchalteEinAus()
    3. btn_AnlageEinAus.Text = Anlage.Beschriftungen
    4. Anlageeingeschaltet(TimerTaktgeber.Enabled)
    5. End Sub


    Das selbe Prinzip kannst du auch bei den beiden Subs anwenden
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btn_BetriebEinAus_Click(sender As Object, e As EventArgs) Handles btn_BetriebEinAus.Click
    2. If Not Betrieb Then
    3. Anlage.BetriebEinAus()
    4. LEDsAnlage.Item(1).BackColor = Anlage.Farbe
    5. btn_BetriebEinAus.Text = Anlage.Beschriftungen
    6. Betrieb = True
    7. CmB_Endtime.Enabled = False
    8. CmB_Starttime.Enabled = False
    9. Nachtanzeigen()
    10. 'ToDo für Lichterkästen
    11. Else
    12. Anlage.BetriebEinAus()
    13. LEDsAnlage.Item(1).BackColor = Anlage.Farbe
    14. btn_BetriebEinAus.Text = Anlage.Beschriftungen
    15. Betrieb = False
    16. CmB_Endtime.Enabled = True
    17. CmB_Starttime.Enabled = True
    18. Nachtanzeigen()
    19. 'ToDo für Lichterkästen
    20. End If
    21. End Sub
    22. Private Sub Anlageeingeschaltet(ByVal AnlageEin As Boolean)
    23. If Not AnlageEin Then
    24. TimerTaktgeber.Start()
    25. LED_PanelEinAus()
    26. btn_BetriebEinAus.Enabled = True
    27. LEDsAnlage.Item(0).BackColor = Anlage.Farbe
    28. ChB_Nachtbetrieb.Enabled = True
    29. ChB_Nachtbetrieb.Checked = True
    30. Else
    31. TimerTaktgeber.Stop()
    32. LED_PanelEinAus()
    33. btn_BetriebEinAus.Enabled = False
    34. LEDsAnlage.Item(0).BackColor = Anlage.Farbe
    35. ChB_Nachtbetrieb.Enabled = False
    36. End If
    37. End Sub


    Ich habe dein Ampelprojekt nicht wirklich verfolgt, aber das ist mir jetzt auf die schnelle ins Auge gefallen.
    Dumm ist der, der dumm ist. Nicht andersrum!

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