Projektbeurteilung Ampelsteuerung
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 109 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.
-
-
Genau. Deine Sub
New
in der KlasseStraße
hat keine Parameter. Damit weißt Du, dass die SubNew
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
- Friend Class Straße
- Public TatsächlicherStraßentyp As Straßentyp
- Private ReadOnly Ampeln As New List(Of Ampel)
- Friend Sub New() 'Standardkonstruktor ohne Parameter
- Ampeln.Add(New Ampel)
- Ampeln.Add(New Ampel)
- End Sub
- Friend Sub New(SollStraßentyp As Straßentyp) 'zusätzlicher Konstruktor mit einem Parameter
- Me.TatsächlicherStraßentyp = SollStraßentyp
- Ampeln.Add(New Ampel)
- Ampeln.Add(New Ampel)
- End Sub
- End Class
Und jetzt wird folgender Code in der Kreuzungsklasse auch funktionieren:
VB.NET-Quellcode
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 schreibstStraß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:- von außen über den Zugriff auf die Property:
NeueStraße.TatsächlicherStraßentyp = Straßentyp.Hauptstraße
- über das Festlegen bei der Instanziierung:
New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße}
- über eine normale Klassenmethode: SetzeStraßentyp(), siehe Post#48
- über einen geeigneten Konstruktor
Public
oderFriend
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
-
- Public Class frm_main
- ReadOnly Steuerung As New Kreuzung
- Private AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
- Friend Enum Betriebsmodus
- Aus
- Normalbetrieb
- Nachtbetrieb
- Störung
- End Enum
- Private Sub btn_anlage_ein_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein.Click
- AnlageEinschalten("Normalbetrieb")
- End Sub
- Private Sub AnlageEinschalten(ByVal Anlagenstatus As String)
- Select Case Anlagenstatus
- Case "Aus"
- Case "Normalbertieb"
- Case "Nachtbetrieb"
- Case "Störung"
- End Select
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
VaporiZed schrieb:
Das Form ruft dazu eine (noch nicht von Dir erstellte) Sub der Klasse Kreuzung auf.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örtAktuellerBetriebsmodus
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
- Public Class Kreuzung
- Private ReadOnly Straßen As New List(Of Straße)
- Friend Sub ErstelleKreuzung()
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
- End Sub
- Dim Betrieb As Betriebsmodus
- Friend Sub AnlageEinschalten(ByVal Betrieb As Betriebsmodus) 'Hier kommt der Fehler
- Select Case Betrieb
- Case Betriebsmodus.Aus
- Case Betriebsmodus.Normalbetrieb
- Case Betriebsmodus.Nachtbetrieb
- Case Betriebsmodus.Störung
- End Select
- End Sub
- End Class
- 'Wieder außerhalb aller Klassen
- Friend Enum Betriebsmodus
- Aus
- Normalbetrieb
- Nachtbetrieb
- Störung
- End Enum
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.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:
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
- Public Class frm_main
- ReadOnly Steuerung As New Kreuzung
- Private Sub btn_anlage_ein_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein.Click
- If Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then
- Steuerung.AnlageEinschalten(Betriebsmodus.Normalbetrieb)
- btn_anlage_ein.Text = "Anlage aus"
- TxTAnzeigen()
- Else
- Steuerung.AnlageEinschalten(Betriebsmodus.Aus)
- btn_anlage_ein.Text = "Anlage ein"
- TxTAnzeigen()
- End If
- End Sub
- Private Sub TxTAnzeigen()
- lbl_bertiebsmodus.Text = Steuerung.AktuellerBetriebsmodus.ToString
- End Sub
- Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- TxTAnzeigen()
- End Sub
- End Class
'Die Class (ohne die Enums etc)
VB.NET-Quellcode
- Public Class Kreuzung
- Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
- Private ReadOnly Straßen As New List(Of Straße)
- Friend Sub ErstelleKreuzung()
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
- End Sub
- Friend Sub AnlageEinschalten(ByVal Betrieb As Betriebsmodus)
- Select Case Betrieb
- Case Betriebsmodus.Aus
- AktuellerBetriebsmodus = Betriebsmodus.Aus
- Case Betriebsmodus.Normalbetrieb
- AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb
- Case Betriebsmodus.Nachtbetrieb
- AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb
- Case Betriebsmodus.Störung
- AktuellerBetriebsmodus = Betriebsmodus.Störung
- End Select
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
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 vonbtn_anlage_ein_Click
in die Kreuzungsklasse.
Inbtn_anlage_ein_Click
darf erstmal nur folgendes stehen:
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 namensAnlagemodusUmschalten
, die keinen Parameter hat. In der soll das passieren, was Du jetzt noch im Button-Code hast: Umschaltung des Betriebsmodus zwischenNormalbetrieb
undAus
. 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 eineFunction
namensHoleBezeichungDesAktuellenBetriebsmodus
. 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
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
- Public Class frm_main
- ReadOnly Steuerung As New Kreuzung
- Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
- Steuerung.AnlageEinAusschalten()
- btn_anlage_ein_aus.Text = Steuerung.getAnlagenmodus
- TextAnzeigeBetriebsmodus()
- End Sub
- Private Sub TextAnzeigeBetriebsmodus()
- lbl_bertiebsmodus.Text = Steuerung.AktuellerBetriebsmodus.ToString
- End Sub
- Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- TextAnzeigeBetriebsmodus()
- End Sub
- End Class
VB.NET-Quellcode
- Public Class Kreuzung
- Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
- Private ReadOnly Straßen As New List(Of Straße)
- Friend Sub ErstelleKreuzung()
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
- End Sub
- Friend Sub AnlageEinAusschalten()
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
- AnlageUmschalten(Betriebsmodus.Normalbetrieb)
- Else
- AnlageUmschalten(Betriebsmodus.Aus)
- End If
- End Sub
- Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
- Select Case Betrieb
- Case Betriebsmodus.Aus
- AktuellerBetriebsmodus = Betrieb
- Case Betriebsmodus.Normalbetrieb
- AktuellerBetriebsmodus = Betrieb
- Case Betriebsmodus.Nachtbetrieb
- AktuellerBetriebsmodus = Betrieb
- Case Betriebsmodus.Störung
- AktuellerBetriebsmodus = Betrieb
- End Select
- End Sub
- Friend Function getAnlagenmodus() As String
- Dim Beschriftung As String
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage Aus" Else Beschriftung = "Anlage Ein"
- Return Beschriftung
- End Function
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amelie“ ()
-
Das ganze
Select Case
inAnlageUmschalten
kann weg.
Das hier reicht:
BeigetAnlagenmodus
kannst Du gerne DeinSelect Case
reinmachen. Da brauchst Du es.
AnlageEinAusschalten
passt erstmal.
Nun können wir zuStö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. -
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
-
- Public Class frm_main
- ReadOnly Steuerung As New Kreuzung
- Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
- btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
- Steuerung.AnlageEinAusschalten()
- TextAnzeigeBetriebsmodus()
- End Sub
- Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
- Steuerung.StörungEinAusschalten()
- TextAnzeigeBetriebsmodus()
- End Sub
- Private Sub TextAnzeigeBetriebsmodus()
- lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
- End Sub
- Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- btn_stoerung_ein_aus.Enabled = False ' <===Das könnte auch schon im Designer passieren???????
- TextAnzeigeBetriebsmodus()
- End Sub
- End Class
VB.NET-Quellcode
-
- Public Class Kreuzung
- Dim Beschriftung As String
- Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
- Private ReadOnly Straßen As New List(Of Straße)
- Friend Sub ErstelleKreuzung()
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
- End Sub
- Friend Sub AnlageEinAusschalten()
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
- AnlageUmschalten(Betriebsmodus.Normalbetrieb)
- frm_main.btn_stoerung_ein_aus.Enabled = True
- Else
- AnlageUmschalten(Betriebsmodus.Aus)
- frm_main.btn_stoerung_ein_aus.Enabled = False
- End If
- End Sub
- Friend Sub StörungEinAusschalten()
- If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb OrElse AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb Then
- AnlageUmschalten(Betriebsmodus.Störung)
- frm_main.btn_stoerung_ein_aus.Enabled = False
- End If
- End Sub
- Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
- AktuellerBetriebsmodus = Betrieb
- End Sub
- Friend Function getAnlagenmodus() As String
- Select Case AktuellerBetriebsmodus
- Case Betriebsmodus.Aus
- Beschriftung = "Anlage ausgeschaltet"
- Case Betriebsmodus.Normalbetrieb
- Beschriftung = "Normalbetrieb"
- Case Betriebsmodus.Nachtbetrieb
- Beschriftung = "Nachtbetrieb"
- Case Betriebsmodus.Störung
- Beschriftung = "Störung"
- End Select
- Return Beschriftung
- End Function
- Friend Function getBtnBeschriftung() As String
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage Aus" Else Beschriftung = "Anlage Ein"
- Return Beschriftung
- End Function
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
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
-
- Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
- btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
- Steuerung.AnlageEinAusschalten()
- TextAnzeigeBetriebsmodus()
- btn_Störung_ein_aus()
- End Sub
- Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
- Steuerung.StörungEinAusschalten()
- TextAnzeigeBetriebsmodus()
- btn_stoerung_ein_aus.Enabled = False
- End Sub
- Private Sub btn_Störung_ein_aus()
- If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True
- End Sub
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.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
-
- Public Class frm_main
- ReadOnly Steuerung As New Kreuzung
- Private Sub btn_anlage_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_anlage_ein_aus.Click
- btn_anlage_ein_aus.Text = Steuerung.getBtnBeschriftung()
- Steuerung.AnlageEinAusschalten()
- TextAnzeigeBetriebsmodus()
- btn_Störung_ein_aus()
- cbx_wechsel_ein_aus()
- End Sub
- Private Sub btn_stoerung_ein_aus_Click(sender As Object, e As EventArgs) Handles btn_stoerung_ein_aus.Click
- Steuerung.StörungEinAusschalten()
- TextAnzeigeBetriebsmodus()
- btn_stoerung_ein_aus.Enabled = False
- End Sub
- Private Sub btn_Störung_ein_aus()
- If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then btn_stoerung_ein_aus.Enabled = True Else btn_stoerung_ein_aus.Enabled = False
- End Sub
- Private Sub cbx_wechsel_ein_aus()
- If Not Steuerung.AktuellerBetriebsmodus = Betriebsmodus.Aus Then cbx_wechsel_24_nacht.Enabled = True Else cbx_wechsel_24_nacht.Enabled = False
- End Sub
- Private Sub cbx_wechsel_24_nacht_CheckedChanged(sender As Object, e As EventArgs) Handles cbx_wechsel_24_nacht.CheckedChanged
- Steuerung.Wechsel24_NachtModus()
- TextAnzeigeBetriebsmodus()
- End Sub
- Private Sub TextAnzeigeBetriebsmodus()
- lbl_bertiebsmodus.Text = Steuerung.getAnlagenmodus()
- cbx_wechsel_24_nacht.Text = Steuerung.getCbxBeschriftung
- End Sub
- Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- btn_stoerung_ein_aus.Enabled = False : cbx_wechsel_24_nacht.Enabled = False
- TextAnzeigeBetriebsmodus()
- End Sub
- End Class
VB.NET-Quellcode
-
- Public Class Kreuzung
- Dim Beschriftung As String
- Friend AktuellerBetriebsmodus As Betriebsmodus = Betriebsmodus.Aus
- Private ReadOnly Straßen As New List(Of Straße)
- Friend Sub ErstelleKreuzung()
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Hauptstraße})
- Straßen.Add(New Straße With {.TatsächlicherStraßentyp = Straßentyp.Nebenstraße})
- End Sub
- Friend Sub AnlageEinAusschalten()
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then
- AnlageUmschalten(Betriebsmodus.Normalbetrieb)
- Else
- AnlageUmschalten(Betriebsmodus.Aus)
- End If
- End Sub
- Friend Sub StörungEinAusschalten()
- If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb OrElse AktuellerBetriebsmodus = Betriebsmodus.Nachtbetrieb Then
- AnlageUmschalten(Betriebsmodus.Störung)
- End If
- End Sub
- Friend Sub AnlageUmschalten(ByVal Betrieb As Betriebsmodus)
- AktuellerBetriebsmodus = Betrieb
- End Sub
- Friend Function getAnlagenmodus() As String
- Select Case AktuellerBetriebsmodus
- Case Betriebsmodus.Aus
- Beschriftung = "Anlage ausgeschaltet"
- Case Betriebsmodus.Normalbetrieb
- Beschriftung = "Normalbetrieb"
- Case Betriebsmodus.Nachtbetrieb
- Beschriftung = "Nachtbetrieb"
- Case Betriebsmodus.Störung
- Beschriftung = "Störung"
- End Select
- Return Beschriftung
- End Function
- Friend Sub Wechsel24_NachtModus()
- If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then AnlageUmschalten(Betriebsmodus.Nachtbetrieb) Else AnlageUmschalten(Betriebsmodus.Normalbetrieb)
- End Sub
- Friend Function getCbxBeschriftung() As String
- If AktuellerBetriebsmodus = Betriebsmodus.Normalbetrieb Then Beschriftung = "24-Std Modus" Else Beschriftung = "Nacht Modus"
- Return Beschriftung
- End Function
- Friend Function getBtnBeschriftung() As String
- If AktuellerBetriebsmodus = Betriebsmodus.Aus Then Beschriftung = "Anlage ausschalten" Else Beschriftung = "Anlage einschalten"
- Return Beschriftung
- End Function
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()
-
Amelie schrieb:
Ja es funktioniert soweit, also kann man das so machen?
Amelie schrieb:
Zugriffsmodifizierer... Hatte ich eine für mich einigermaßen plausible Erklärung gepostet.
Public
: alle Programme und Programmkomponenten (nicht nur der eigenen Code, sondern auch Fremdprogramme) können auf das mitPublic
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.
EinePublic Sub AnlageUmschalten(Betrieb As Betriebsmodus)
wirft automatisch einen Fehler, weilAnlageUmschalten
zwar für andere Programme zugänglich ist,Betriebsmodus
aber nur mitFriend
deklariert wurde. Daher kann ein externes Programm die Sub nicht aufrufen, weil sieBetriebsmodus
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:
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. -
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??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.
-
Ähnliche Themen
-
Daniel93 - - Sonstige Problemstellungen
-
6 Benutzer haben hier geschrieben
- Amelie (51)
- VaporiZed (48)
- ErfinderDesRades (4)
- petaod (3)
- Gonger96 (3)
- Gast (1)