Projektbeurteilung Ampelsteuerung

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

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

    Genau. Deine Sub New in der Klasse Straße hat keine Parameter. Damit weißt Du, dass die Sub New der Klasse (der sogenannte Konstruktor) eine mehr oder weniger normale Methode einer Klasse ist, die ggf. Parameter aufnehmen kann. Das ermöglicht Dir auf eine weitere Weise festzulegen, welchen Straßentyp eine neue Straße hat. Indem Du die Information über den Konstruktor mitgibst. Du kannst auch mehrere Konstruktoren schreiben. Das nennt sich Überladung. Das Prinzip kann man immer wieder nutzen. Der Name einer Methode darf gleich bleiben, nur die Parameter müssen anders sein. In Datentyp oder Anzahl:

    VB.NET-Quellcode

    1. Friend Class Straße
    2. Public TatsächlicherStraßentyp As Straßentyp
    3. Private ReadOnly Ampeln As New List(Of Ampel)
    4. Friend Sub New() 'Standardkonstruktor ohne Parameter
    5. Ampeln.Add(New Ampel)
    6. Ampeln.Add(New Ampel)
    7. End Sub
    8. Friend Sub New(SollStraßentyp As Straßentyp) 'zusätzlicher Konstruktor mit einem Parameter
    9. Me.TatsächlicherStraßentyp = SollStraßentyp
    10. Ampeln.Add(New Ampel)
    11. Ampeln.Add(New Ampel)
    12. End Sub
    13. End Class

    Und jetzt wird folgender Code in der Kreuzungsklasse auch funktionieren:

    VB.NET-Quellcode

    1. Friend Sub ErstelleKreuzung()
    2. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße}) '1. Straße, Aufruf des normalen, parameterlosen Konstruktors
    3. Straßen.Add(New Straße(Straßentyp.Nebenstraße)) '2. Straße, Aufruf des 2. Konstruktors, eben mit Parameter
    4. End Sub


    Weil ein Parameter bei der 2. Straße mitgegeben wird, weiß der Compiler automatisch, dass er den 2. Konstruktor aufrufen muss. Ein anderer Parametertyp, also z.B. wenn Du schreibst Straßen.Add(New Straße("Berliner Allee")) würde zum Problem führen, da der Compiler keinen passenden Konstruktor in der Klasse finden kann.

    Damit weißt Du also, wie man eine Property einer Klasseninstanz auf 4 Arten festlegen kann:
    1. von außen über den Zugriff auf die Property: NeueStraße.TatsächlicherStraßentyp = Straßentyp.Hauptstraße
    2. über das Festlegen bei der Instanziierung: New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße}
    3. über eine normale Klassenmethode: SetzeStraßentyp(), siehe Post#48
    4. über einen geeigneten Konstruktor
    Punkt 1 und 2 haben die Besonderheit, dass die Ziel-Property von außen erreichbar sein muss, die Property muss also mit Public oder Friend deklariert sein.
    Punkt#3 hat die Besonderheit, dass der Straßentyp jederzeit von außen geändert werden kann. Obwohl das hier bei einem Straßentyp nicht sinnvoll ist.
    Punkt 4 legt die Property von Anfang an fest.
    Behalte alle Möglichkeiten in Erinnerung, Du wirst die verschiedenen Möglichkeiten immer wieder brauchen.

    Falls Du bis dahin zu den bisherigen Grundlagen keine Fragen hast, bauen wir die Kreuzungsklasse etwas aus. Der User soll über einen Button auf dem Form den Arbeitsmodus der Kreuzungsanlage festlegen können. Das Form ruft dazu eine (noch nicht von Dir erstellte) Sub der Klasse Kreuzung auf. Erstelle und benenne mal jene Sub und lege fest, ob und wenn ja welche(n) Parameter sie zum sinnvollen Betriebswechsel braucht.
    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 5 mal editiert, zuletzt von „VaporiZed“ ()

    OK
    Mein Vorschlag:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    4. Friend Enum Betriebsmodus
    5. Aus
    6. Normalbetrieb
    7. Nachtbetrieb
    8. Störung
    9. End Enum
    10. Private Sub btn_anlage_ein_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein.Click
    11. AnlageEinschalten("Normalbetrieb")
    12. End Sub
    13. Private Sub AnlageEinschalten(ByVal Anlagenstatus As String)
    14. Select Case Anlagenstatus
    15. Case "Aus"
    16. Case "Normalbertieb"
    17. Case "Nachtbetrieb"
    18. Case "Störung"
    19. End Select
    20. End Sub
    21. End Class

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

    VaporiZed schrieb:

    Das Form ruft dazu eine (noch nicht von Dir erstellte) Sub der Klasse Kreuzung auf.
    Das hast Du damit leider aber nicht umgesetzt. Das Form soll hier nur die Benutzereingaben an die Klasse Kreuzung weiterleiten. Keine Entscheidungen treffen. Und mit Strings fangen wir für Arbeitsmodi gar nicht erst an. Du hast ja selber schon ein weiteres Enum eingeführt: Betriebsmodus. Nutze es. Aber auch erst, sobald das Enum außerhalb der Formklasse ist! Keine Schachtelung!
    Was noch dazukommt: AktuellerBetriebsmodus ist momentan Teil der Formklasse. Das bedeutet, Du triffst eine Aussage über den Betriebsmodus des Formulars! Du willst aber eine Aussage über den Betriebsmodus der Kreuzungssteuerung festlegen. Also gehört AktuellerBetriebsmodus nicht in die Formklasse, sondern in …?

    kleiner Tipp bezüglich Benutzer -> Form -> Kreuzung: Wie hat denn der Benutzer bei Deiner Nicht-OOP-Version dem Programm mitgeteil, in welchem Modus sich die Kreuzung befinden soll? Den fast gleichen Weg musst Du auch jetzt gehen.
    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    OK habe nun das aber mit Fehler den ich nicht erklären kann.
    Fehler: Fehler 1 "Betrieb" kann den Betriebsmodus-Typ nicht außerhalb des Projekts über class "Kreuzung" verfügbar machen.
    Setzte ich die Sub auf "Private" ist der Fehler zwar weg aber dann kann ich ja nicht mehr darauf zugreifen. hmmmmmm??

    EDIT: Mit Friend geht es. Wo ist jetzt der Unterschied Private und Friend? Sind doch beide nicht öffentlich. Nochmal studieren muss.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Private ReadOnly Straßen As New List(Of Straße)
    3. Friend Sub ErstelleKreuzung()
    4. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    5. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    6. End Sub
    7. Dim Betrieb As Betriebsmodus
    8. Friend Sub AnlageEinschalten(ByVal Betrieb As Betriebsmodus) 'Hier kommt der Fehler
    9. Select Case Betrieb
    10. Case Betriebsmodus.Aus
    11. Case Betriebsmodus.Normalbetrieb
    12. Case Betriebsmodus.Nachtbetrieb
    13. Case Betriebsmodus.Störung
    14. End Select
    15. End Sub
    16. End Class
    17. 'Wieder außerhalb aller Klassen
    18. Friend Enum Betriebsmodus
    19. Aus
    20. Normalbetrieb
    21. Nachtbetrieb
    22. Störung
    23. End Enum

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

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

    Sobald Du Dich über Friend, Public und Co. informiert hast und die Antwort auf die Fehlermeldung kennst und verstanden hast, kann es weitergehen. Solltest Du trotz Deiner Nachforschungen nicht weiterkommen, gib bescheid. Diese sogenannten Zugriffsmodifizierer sind für OOP wichtig und deren Bedeutung sollte klar sein.
    Ansonsten bitte noch die Fragen aus Post#64 verarbeiten und beantworten.
    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

    In der Nicht-OOP Version ging das über:

    VB.NET-Quellcode

    1. Dim Betriebsphase As String : Dim Anlage_Ein As Boolean

    Und da dann eben ob True oder False. So wurde quasie die ganze Anlage gesteuert.
    -------------
    Das mit Friend, Public etc habe ich noch nicht ganz verstanden, weil die Literatur sich mal wieder so unklar ausdrückt.
    Mit Friend kann ich also nur in meinem derzeitigen Projekt arbeiten?
    Will ich bestimmte Teile anders verwenden müßte ich alles auf "Public und Private" um ändern?
    -------------
    Habe dann das "Einschalten" geändert.
    Spoiler anzeigen

    'Das Form (nur ein Button und ein Label)

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub btn_anlage_ein_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein.Click
    4. If Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then
    5. Steuerung.AnlageEinschalten(Betriebsmodus.Normalbetrieb)
    6. btn_anlage_ein.Text = "Anlage aus"
    7. TxTAnzeigen()
    8. Else
    9. Steuerung.AnlageEinschalten(Betriebsmodus.Aus)
    10. btn_anlage_ein.Text = "Anlage ein"
    11. TxTAnzeigen()
    12. End If
    13. End Sub
    14. Private Sub TxTAnzeigen()
    15. lbl_bertiebsmodus.Text = Steuerung.AktuellerBetriebsmodus.ToString
    16. End Sub
    17. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    18. TxTAnzeigen()
    19. End Sub
    20. End Class

    'Die Class (ohne die Enums etc)

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    3. Private ReadOnly Straßen As New List(Of Straße)
    4. Friend Sub ErstelleKreuzung()
    5. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    6. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    7. End Sub
    8. Friend Sub AnlageEinschalten(ByVal Betrieb As Betriebsmodus)
    9. Select Case Betrieb
    10. Case Betriebsmodus.Aus
    11. AktuellerBetriebsmodus = Betriebsmodus.Aus
    12. Case Betriebsmodus.Normalbetrieb
    13. AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb
    14. Case Betriebsmodus.Nachtbetrieb
    15. AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb
    16. Case Betriebsmodus.Störung
    17. AktuellerBetriebsmodus = Betriebsmodus.Störung
    18. End Select
    19. End Sub
    20. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Die Frage, wie der Benutzer der Kreuzungsklasse mitteilt, in welchem Zustand sie sein soll, hast Du zwar nicht mit Worten, aber mit Code beantwortet: Der Benutzer entscheidet durch einen Klick auf einen Button. Gut.
    Nun bist Du noch etwas zu sehr in Formentscheidungscode verwickelt. Das Form soll gar nix entscheiden. Das ist die Aufgabe der Kreuzungsklasse. Daher: Sobald Du ein If im Form schreiben willst, kannst Du davon ausgehen, dass Du in der falschen Klasse bist. Zumindest, wenn nun änderungen an einer eigenen Klasse vorgenommen werden sollen.
    Verfrachte also die If-Geschichte der Modusumschaltung von btn_anlage_ein_Click in die Kreuzungsklasse.
    In btn_anlage_ein_Click darf erstmal nur folgendes stehen:

    VB.NET-Quellcode

    1. Private Sub btn_anlage_ein_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein.Click
    2. Steuerung.AnlagemodusUmschalten()
    3. btn_anlage_ein.Text = Steuerung.HoleBezeichungDesAktuellenBetriebsmodus
    4. TxTAnzeigen()
    5. End Sub

    Mehr nicht. Das Form entscheidet gar nichts und soll auch keine Details der Kreuzungsklasse kennen. Das sind alles Aufgaben der Kreuzungsklasse. Je mehr das Form weiß und entscheiden soll, desto zentraler wird die Bedeutung des Forms. Und wenn dann das Form irgendwann alles wieder kann/weiß/tut, tja, dann bist Du wieder bei Deiner Nicht-OOP-Version.
    Durch die genannte Änderung des Button-Click-Codes ergeben sich einige neue Punkte: Du brauchst in der Kreuzungsklasse eine zusätzliche Sub namens AnlagemodusUmschalten, die keinen Parameter hat. In der soll das passieren, was Du jetzt noch im Button-Code hast: Umschaltung des Betriebsmodus zwischen Normalbetrieb und Aus. Nichts anderes! Der Benutzer soll mit diesem Umschaltebutton nichts anderes können. So habe ich den Code und das frühere Nicht-OOP-Projekt verstanden. Daher ergibt es keinen Sinn, da mehr einzubauen.
    Dann brauchst Du in der Kreuzungsklasse eine Function namens HoleBezeichungDesAktuellenBetriebsmodus. Diese Methode soll Dir nur einen String wie "Anlage ein", "Anlage aus" wiedergeben, abhängig vom Betriebsmodus.

    Schau mal Deinen Kreuzungsklasse-AnlageEinschalten-Code an: Den kannst Du auf das hier reduzieren: AktuellerBetriebsmodus = Betrieb

    Thema Benennung:
    • TxTAnzeigen - warum TxT und nicht Text? Und: werd konkret. Welcher Text solll angezeigt werden? Benenne die Sub entsprechend.
    • btn_anlage_ein: Das suggeriert, dass man damit die Anlage einschalten kann und nichts anderes. Das stimmt aber nicht. Man kann sie auch ausschalten.
    • Kreuzungsklasse: AnlageEinschalten -> AnlageUmschalten
    btw: ByVal kannst Du immer weglassen
    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 gehe mal davon aus, das die Funktion "HoleBetriebstatus" jetzt erstmal NUR für den einen Button sein sollte?
    Rest habe ich auch geändert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    4. Steuerung.AnlageEinAusschalten()
    5. btn_anlage_ein_aus.Text = Steuerung.getAnlagenmodus
    6. TextAnzeigeBetriebsmodus()
    7. End Sub
    8. Private Sub TextAnzeigeBetriebsmodus()
    9. lbl_bertiebsmodus.Text = Steuerung.AktuellerBetriebsmodus.ToString
    10. End Sub
    11. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. TextAnzeigeBetriebsmodus()
    13. End Sub
    14. End Class

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    3. Private ReadOnly Straßen As New List(Of Straße)
    4. Friend Sub ErstelleKreuzung()
    5. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    6. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    7. End Sub
    8. Friend Sub AnlageEinAusschalten()
    9. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
    10. AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    11. Else
    12. AnlageUmschalten(Betriebsmodus.Aus)
    13. End If
    14. End Sub
    15. Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
    16. Select Case Betrieb
    17. Case Betriebsmodus.Aus
    18. AktuellerBetriebsmodus = Betrieb
    19. Case Betriebsmodus.Normalbetrieb
    20. AktuellerBetriebsmodus = Betrieb
    21. Case Betriebsmodus.Nachtbetrieb
    22. AktuellerBetriebsmodus = Betrieb
    23. Case Betriebsmodus.Störung
    24. AktuellerBetriebsmodus = Betrieb
    25. End Select
    26. End Sub
    27. Friend Function getAnlagenmodus() As String
    28. Dim Beschriftung As String
    29. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage Aus" Else Beschriftung = "Anlage Ein"
    30. Return Beschriftung
    31. End Function
    32. End Class

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

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

    Das ganze Select Case in AnlageUmschalten kann weg.
    Das hier reicht:

    VB.NET-Quellcode

    1. Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
    2. AktuellerBetriebsmodus = Betrieb
    3. End Sub

    Bei getAnlagenmodus kannst Du gerne Dein Select Case reinmachen. Da brauchst Du es.
    AnlageEinAusschalten passt erstmal.
    Nun können wir zu Störung kommen. Unter welchen Bedingungen soll die Kreuzung in den Störungsmodus gehen?

    #########

    (Formfehler korrigiert)
    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“ ()

    Bei getAnlagenmodus kannst Du gerne Dein Select Case reinmachen. Da brauchst Du es.
    Also soll die Funktion NICHT NUR für den einen Button sein?
    ----
    Tja wann kann sowas eine Störung bekommen???
    In fast allen Beispielen die ich so gesehen habe wird das immer mit einem Schalter simuliert.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Korrekt. Die Anzeige brauchst Du auch noch später bei anderen Modi (Stöung, Nachtbetrieb).
    Das musst Du jetzt für Dich festlegen, wann Dein Programm die Störung erzeugt oder auslöst.
    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 das nun so gelößt. Die Störung wird einfach per Button simuliert; dieser ist erst aktiv wenn die Anlage in einem anderen außer dem Betriebstzustand Aus ist.
    Nun weiß ich nicht ob das dann richtig ist, das ich aus der Klasse heraus den Button Störung aktiviere/deaktiviere.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    4. btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
    5. Steuerung.AnlageEinAusschalten()
    6. TextAnzeigeBetriebsmodus()
    7. End Sub
    8. Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
    9. Steuerung.StörungEinAusschalten()
    10. TextAnzeigeBetriebsmodus()
    11. End Sub
    12. Private Sub TextAnzeigeBetriebsmodus()
    13. lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
    14. End Sub
    15. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. btn_stoerung_ein_aus.Enabled = False ' <===Das könnte auch schon im Designer passieren???????
    17. TextAnzeigeBetriebsmodus()
    18. End Sub
    19. End Class


    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Dim Beschriftung As String
    3. Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    4. Private ReadOnly Straßen As New List(Of Straße)
    5. Friend Sub ErstelleKreuzung()
    6. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    7. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    8. End Sub
    9. Friend Sub AnlageEinAusschalten()
    10. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
    11. AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    12. frm_main.btn_stoerung_ein_aus.Enabled = True
    13. Else
    14. AnlageUmschalten(Betriebsmodus.Aus)
    15. frm_main.btn_stoerung_ein_aus.Enabled = False
    16. End If
    17. End Sub
    18. Friend Sub StörungEinAusschalten()
    19. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb OrElse AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb Then
    20. AnlageUmschalten(Betriebsmodus.Störung)
    21. frm_main.btn_stoerung_ein_aus.Enabled = False
    22. End If
    23. End Sub
    24. Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
    25. AktuellerBetriebsmodus = Betrieb
    26. End Sub
    27. Friend Function getAnlagenmodus() As String
    28. Select Case AktuellerBetriebsmodus
    29. Case Betriebsmodus.Aus
    30. Beschriftung = "Anlage ausgeschaltet"
    31. Case Betriebsmodus.Normalbetrieb
    32. Beschriftung = "Normalbetrieb"
    33. Case Betriebsmodus.Nachtbetrieb
    34. Beschriftung = "Nachtbetrieb"
    35. Case Betriebsmodus.Störung
    36. Beschriftung = "Störung"
    37. End Select
    38. Return Beschriftung
    39. End Function
    40. Friend Function getBtnBeschriftung() As String
    41. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage Aus" Else Beschriftung = "Anlage Ein"
    42. Return Beschriftung
    43. End Function
    44. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Stop! In der Kreuzungsklasse wird nix am Form geändert. Das macht das Form schön selbst.
    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.
    grrrrrr Dachte ich mir fast das dass falsch ist.

    Also in der Form eine Sub anlegen die abfragt ob Button Enabeld oder nicht?

    Edit:17:00
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    2. btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
    3. Steuerung.AnlageEinAusschalten()
    4. TextAnzeigeBetriebsmodus()
    5. btn_Störung_ein_aus()
    6. End Sub
    7. Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
    8. Steuerung.StörungEinAusschalten()
    9. TextAnzeigeBetriebsmodus()
    10. btn_stoerung_ein_aus.Enabled = False
    11. End Sub
    12. Private Sub btn_Störung_ein_aus()
    13. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True
    14. End Sub

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

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

    Vom Prinzip her ist das jetzt richtig.
    Wenn es bis jetzt so funktioniert wie erwartet, ist alles gut. Dann kann es ja weitergehen. Bist Du eigentlich zu einem Ergebnis bei den Zugriffsmodifizierern gekommen? Alles klar jetzt?
    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.
    Ja es funktioniert soweit, also kann man das so machen?
    ---
    Zugriffsmodifizierer... Hatte ich eine für mich einigermaßen plausible Erklärung gepostet.

    Hier nochmal:
    Das mit Friend, Public etc habe ich noch nicht ganz verstanden, weil die Literatur sich mal wieder so unklar ausdrückt.
    Mit Friend kann ich also nur in meinem derzeitigen Projekt arbeiten?
    Will ich bestimmte Teile anders verwenden müßte ich alles auf "Public und Private" um ändern?

    @VaporiZed
    Edit: 21:15
    Habe nun die CheckBox für das Umschalten 24Std-Modus oder Nacht-Modus eingebaut. Hoffe das ist so OK ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. ReadOnly Steuerung As New Kreuzung
    3. Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
    4. btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
    5. Steuerung.AnlageEinAusschalten()
    6. TextAnzeigeBetriebsmodus()
    7. btn_Störung_ein_aus()
    8. cbx_wechsel_ein_aus()
    9. End Sub
    10. Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
    11. Steuerung.StörungEinAusschalten()
    12. TextAnzeigeBetriebsmodus()
    13. btn_stoerung_ein_aus.Enabled = False
    14. End Sub
    15. Private Sub btn_Störung_ein_aus()
    16. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True Else btn_stoerung_ein_aus.Enabled = False
    17. End Sub
    18. Private Sub cbx_wechsel_ein_aus()
    19. If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then cbx_wechsel_24_nacht.Enabled = True Else cbx_wechsel_24_nacht.Enabled = False
    20. End Sub
    21. Private Sub cbx_wechsel_24_nacht_CheckedChanged(sender As Object, e As EventArgs) Handles cbx_wechsel_24_nacht.CheckedChanged
    22. Steuerung.Wechsel24_NachtModus()
    23. TextAnzeigeBetriebsmodus()
    24. End Sub
    25. Private Sub TextAnzeigeBetriebsmodus()
    26. lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
    27. cbx_wechsel_24_nacht.Text = Steuerung.getCbxBeschriftung
    28. End Sub
    29. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    30. btn_stoerung_ein_aus.Enabled = False : cbx_wechsel_24_nacht.Enabled = False
    31. TextAnzeigeBetriebsmodus()
    32. End Sub
    33. End Class

    VB.NET-Quellcode

    1. Public Class Kreuzung
    2. Dim Beschriftung As String
    3. Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
    4. Private ReadOnly Straßen As New List(Of Straße)
    5. Friend Sub ErstelleKreuzung()
    6. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
    7. Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
    8. End Sub
    9. Friend Sub AnlageEinAusschalten()
    10. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
    11. AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    12. Else
    13. AnlageUmschalten(Betriebsmodus.Aus)
    14. End If
    15. End Sub
    16. Friend Sub StörungEinAusschalten()
    17. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb OrElse AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb Then
    18. AnlageUmschalten(Betriebsmodus.Störung)
    19. End If
    20. End Sub
    21. Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
    22. AktuellerBetriebsmodus = Betrieb
    23. End Sub
    24. Friend Function getAnlagenmodus() As String
    25. Select Case AktuellerBetriebsmodus
    26. Case Betriebsmodus.Aus
    27. Beschriftung = "Anlage ausgeschaltet"
    28. Case Betriebsmodus.Normalbetrieb
    29. Beschriftung = "Normalbetrieb"
    30. Case Betriebsmodus.Nachtbetrieb
    31. Beschriftung = "Nachtbetrieb"
    32. Case Betriebsmodus.Störung
    33. Beschriftung = "Störung"
    34. End Select
    35. Return Beschriftung
    36. End Function
    37. Friend Sub Wechsel24_NachtModus()
    38. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then AnlageUmschalten(Betriebsmodus.Nachtbetrieb) Else AnlageUmschalten(Betriebsmodus.Normalbetrieb)
    39. End Sub
    40. Friend Function getCbxBeschriftung() As String
    41. If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then Beschriftung = "24-Std Modus" Else Beschriftung = "Nacht Modus"
    42. Return Beschriftung
    43. End Function
    44. Friend Function getBtnBeschriftung() As String
    45. If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage ausschalten" Else Beschriftung = "Anlage einschalten"
    46. Return Beschriftung
    47. End Function
    48. End Class



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

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

    Amelie schrieb:

    Ja es funktioniert soweit, also kann man das so machen?
    Aufbautechnisch passt das soweit. Klassen grapschen sich jetzt nicht gegenseitig ins Getriebe, sondern bitten um Ausführung von Anweisungen (Subs) bzw. bitten andere Klassen um Informationen (Functions). So soll es sein.

    Amelie schrieb:

    Zugriffsmodifizierer... Hatte ich eine für mich einigermaßen plausible Erklärung gepostet.
    Naja, nach komplett verstanden klang das nicht. Nochmal kurz die drei für Dich momentan relevanten:
    Public: alle Programme und Programmkomponenten (nicht nur der eigenen Code, sondern auch Fremdprogramme) können auf das mit Public Deklarierte zugreifen
    Friend: alle Programmkomponenten des eigenen Projektes können auf den Codeteil zugreifen
    Private: nur die Klasse, in der der Codeteil deklariert wird, kann darauf zugreifen.
    Eine Public Sub AnlageUmschalten(Betrieb As Betriebsmodus) wirft automatisch einen Fehler, weil AnlageUmschalten zwar für andere Programme zugänglich ist, Betriebsmodus aber nur mit Friend deklariert wurde. Daher kann ein externes Programm die Sub nicht aufrufen, weil sie Betriebsmodus nicht kennt. Daher sagt der Compiler: Das geht so nicht.

    Störung: Ok, wenn Du das nur als Button drinhaben willst, belassen wir es dabei. Vielleicht fällt Dir ja irgendwann noch eine Situation ein, bei dem noch eine Störung auftreten kann.

    Dann kommen wir zu den Ampelphasenumschaltungen. Noch nicht mit Takt, sondern erstmal manuell. Der Taktgeber sollte aber bald folgen.
    Wie würde eine Sub für eine manuelle Umschaltung einer Lichtanlage für Autos aussehen? Jeder Sub-Aufruf soll die Ampel in ihre nächste reguläre Phase bringen. Belassen wir es erstmal bei der Hauptstraßenampel. Da stellt sich eigentlich gleich die Frage: Wenn die Kreuzung und die Straßen erstellt werden, mit welcher Phase beginnen die Lichtkästen?
    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.
    (nicht nur der eigenen Code, sondern auch Fremdprogramme) können
    Huii Das kling ja mal garnicht toll. So habe ich das nicht verstanden. Aber jetzt schon

    Das mit der Störung habe ich auch schon überlegt aber mir fiel bisher nix besseres ein.

    OK Ampelphasen. Hab da einiges gelesen und da gibts dann wohl unterschiedlichste Herangehensweisen. Ich würde es so machen:

    VB.NET-Quellcode

    1. Friend Enum Ampelphase_Auto
    2. HsRotGelb_NsRot
    3. HsGrün_NsRot
    4. HsGelb_NsRot
    5. HsRot_NsRot
    6. NsRotGelb_HsRot
    7. NsGrün_HsRot
    8. NsGelb_HsRot
    9. NsRot_HsRot
    10. End Enum

    OK sind nun auch die Nebenstr drin aber kann man ja weglassen.
    Für den Rest mit der Sub ... noch keine richtige Idee ... ;(

    Evtl Einen Zähler der bei jedem Buttonklick um eins erhöt wird und dabei aus der ENUM ausliest??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Mit den Ampelphasen wird es jetzt etwas komplizierter. Solange Du nur eine Haupt- und eine Nebenstraße hast, geht das. Aber spätestens wenn eine Straße dazukommt, könnte es vielleicht nicht mehr funktionieren. Kann ich noch nicht sagen.

    Amelie schrieb:

    Evtl Einen Zähler der bei jedem Buttonklick um eins erhöt wird und dabei aus der ENUM ausliest??
    Gut! Denn die Enum-Werte sind ja nur sprechende Namen für Integer-Werte, die bei 0 losgehen. Versuch das 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.