Modell für ein Parkhaus

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

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

    Modell für ein Parkhaus

    Nachdem ich nun wieder einige gelernt habe, bin ich an eine neue Aufgabe gegangen.
    Beschreibung:
    Ein kleines privates Parkhaus mit einer Einfahrt und Ausfahrt verfügt über X Stellplätze. An der Einfahrt und Ausfahrt sind Schranken montiert. Ein und ausfahrende Autos werden gezählt. Zusätzlich befindet sich an der Einfahrt eine Ampel. Die grüne Leuchte signalisiert freie Einfahrt, die rote Leuchte ein volles Parkhaus. Zudem zeigt eine Anzeige den Autofahrern wie viele Plätze frei sind.Sofern freie Plätze vorhanden sind, soll ein Freigabe-Signal ( per Butten simulierter Magnetstreifen ) an die selbst gesteuerte Einfahrtschranke ausgegeben werden.Für die Überwachung der freien Plätze wird ein Zähler angewendet. Jedes einfahrende Auto verursacht somit eine Verringerung der Anzahl der freien Plätze. Jedes herausfahrende Auto die Erhöhung der Anzahl der freien Plätze im Parkhaus. Mit überqueren des Magnetstreifen soll die Schranke ( Ein und Ausfahrt ) nach einer vorgegebenen Zeit öffnen und wieder schließen.

    Was ich bemerkte ist, das wenn man zu schnell auf die Buttons klickt der Timer manchmal hängt...

    Hier der Code den ich nun erstellt habe: " Option Explicit / Opton Strict /Option Infer " alle auf ON :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim Parkhaus As New Gebäude
    3. Public btn_E_1EinfahrtAlreadyClicked As Boolean
    4. Public btn_A_1AusfahrtAlreadyClicked As Boolean
    5. Private Sub frn_main_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    6. Einstellungen()
    7. End Sub
    8. Private Sub Einstellungen()
    9. Timer1.Stop()
    10. btn_A_1Ausfahrt.Enabled = False
    11. Parkhaus._Stellplätze = 5
    12. lb_freiStellplatz.Text = "Freie Stellplätze: " & Parkhaus._Stellplätze
    13. lb_Gesamtautos.Text = "Anzahl gesammt: " & Parkhaus._Zählerausfahrt
    14. 'Anzahl der Stellplätze ( Erweiterung )
    15. 'cmb_stellplätze.DataSource = "2 5 10 15 20".Split
    16. End Sub
    17. Friend Sub Schrankenzeiten()
    18. Select Case True
    19. Case btn_E_1EinfahrtAlreadyClicked = True
    20. Dim _Ort As String = CStr(Gebäude.Standort.Einfahrt)
    21. Parkhaus._Zeit = (Parkhaus._Zeit + 1) Mod 2
    22. Parkhaus._neuStatus = CType(Parkhaus._Zeit, Gebäude.Schrankenstatus)
    23. Timer1.Interval = Parkhaus._Schrankenphasen(Parkhaus._Zeit)
    24. Parkhaus.Schrankensteuerung(CType(_Ort, Gebäude.Standort), Parkhaus._neuStatus)
    25. Case btn_A_1AusfahrtAlreadyClicked = True
    26. Dim _Ort As String = CStr(Gebäude.Standort.Ausfahrt)
    27. Parkhaus._Zeit = (Parkhaus._Zeit + 1) Mod 2
    28. Parkhaus._neuStatus = CType(Parkhaus._Zeit, Gebäude.Schrankenstatus)
    29. Timer1.Interval = Parkhaus._Schrankenphasen(Parkhaus._Zeit)
    30. Parkhaus.Schrankensteuerung(CType(_Ort, Gebäude.Standort), Parkhaus._neuStatus)
    31. End Select
    32. End Sub
    33. Friend Sub Steurungsignalgeber()
    34. If Parkhaus._Stellplätze = 0 Then : btn_E_1Einfahrt.Enabled = False : Else : btn_E_1Einfahrt.Enabled = True : End If
    35. If Parkhaus._Stellplätze = 5 Then : btn_A_1Ausfahrt.Enabled = False : ElseIf Parkhaus._Stellplätze < 4 Then
    36. : btn_A_1Ausfahrt.Enabled = True : Else : btn_A_1Ausfahrt.Enabled = True : End If
    37. End Sub
    38. Friend Sub Anzeigen(ByVal AnzeigeAmpel As Gebäude.Ampelsignal)
    39. Select Case AnzeigeAmpel
    40. Case Gebäude.Ampelsignal.Grün
    41. 'Anzeige ein Bild oder ....
    42. Case Gebäude.Ampelsignal.Rot
    43. 'Anzeige ein Bild oder ....
    44. End Select
    45. End Sub
    46. Friend Sub AnzeigeZähler()
    47. lb_freiStellplatz.Text = "Freie Stellplätze: " & Parkhaus._Stellplätze
    48. lb_Gesamtautos.Text = " Anzahl gesammt: " & Parkhaus._Zählerausfahrt
    49. End Sub
    50. Private Sub btn_E_1Einfahrt_Click(sender As Object, e As EventArgs) Handles btn_E_1Einfahrt.Click
    51. btn_A_1AusfahrtAlreadyClicked = False
    52. btn_E_1EinfahrtAlreadyClicked = True
    53. Timer1.Start()
    54. Parkhaus._anzahl = "E_1"
    55. Parkhaus.Stellplatzzähler(Parkhaus._anzahl)
    56. End Sub
    57. Private Sub btn_A_1Ausfahrt_Click(sender As Object, e As EventArgs) Handles btn_A_1Ausfahrt.Click
    58. btn_A_1AusfahrtAlreadyClicked = True
    59. btn_E_1EinfahrtAlreadyClicked = False
    60. Timer1.Start()
    61. Parkhaus._anzahl = "A_1"
    62. Parkhaus.Stellplatzzähler(Parkhaus._anzahl)
    63. End Sub
    64. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    65. Schrankenzeiten()
    66. End Sub
    67. End Class
    68. Public Class Gebäude
    69. Public Enum Ampelsignal : Rot : Grün : End Enum
    70. Public Enum Standort : Einfahrt : Ausfahrt : End Enum
    71. Public Enum Schrankenstatus : geschlossen : offen : End Enum
    72. Public _neuOrt As Standort = Standort.Einfahrt
    73. Public _neuStatus As Schrankenstatus = Schrankenstatus.offen
    74. Public _Ort As String
    75. Public _Zeit As Integer = 0
    76. Public _Schrankenphasen() As Integer = {3000, 2000}
    77. Public _Zählerausfahrt As Integer = 0
    78. Public _Stellplätze As Integer
    79. 'Public varStellPlatz As Integer
    80. 'Public varStellPlatz2 As Integer
    81. Public _anzahl As String
    82. Public Sub Gesamtanzahl()
    83. _Zählerausfahrt = _Zählerausfahrt + 1
    84. End Sub
    85. Public Sub Stellplatzzähler(ByVal _anzahl As String)
    86. Select Case _anzahl
    87. Case "E_1"
    88. _Stellplätze = _Stellplätze - 1
    89. frm_main.AnzeigeZähler()
    90. If _Stellplätze = 0 Then : frm_main.Anzeigen(Ampelsignal.Rot) : Else : frm_main.Anzeigen(Ampelsignal.Grün) : End If
    91. Case "A_1"
    92. _Stellplätze = _Stellplätze + 1
    93. Gesamtanzahl()
    94. frm_main.AnzeigeZähler()
    95. End Select
    96. frm_main.Steurungsignalgeber()
    97. End Sub
    98. Public Sub Schrankensteuerung(ByVal ort As Standort, status As Schrankenstatus)
    99. Select Case ort
    100. Case Standort.Einfahrt
    101. Select Case status
    102. Case Schrankenstatus.offen
    103. 'tue etwas
    104. Case Schrankenstatus.geschlossen
    105. 'tue etwas
    106. End Select
    107. Case Standort.Ausfahrt
    108. Select Case status
    109. Case Schrankenstatus.offen
    110. 'tue etwas
    111. Case Schrankenstatus.geschlossen
    112. 'tue etwas
    113. End Select
    114. Case Else
    115. 'Für Ausnahmezustände
    116. End Select
    117. End Sub
    118. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Wenn Du solch Probleme hast, sollte Dein Code compilieren.
    Deiner compiliert nicht, weil zu viel fehlt.
    Häng doch gleich das bereinigte Projekt an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich habe bereinigt und auf Neu erstellen geklickt. ( oder was meinst du?? )
    Ansonsten läuft der Code ja nur das der Timer manchmal hängt.
    Dateien
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    und auf Neu erstellen
    Genau dabei werden die vielen Dateien generiert, die wir auif dem Forums-Server weder brauchen noch haben wollen.
    ====
    OK, alles in Ordnung. Die Verzeichnisse obj, bin, vs waren nicht dabei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amelie Sieh Dir mal genau die Unterschiede an,
    dafür gibt es dieses Tool:
    winmerge.org/downloads/?lang=de
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim Parkhaus As New Gebäude
    3. Public btn_E_1EinfahrtAlreadyClicked As Boolean
    4. Public btn_A_1AusfahrtAlreadyClicked As Boolean
    5. Private Sub frn_main_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    6. Einstellungen()
    7. End Sub
    8. Private Sub Einstellungen()
    9. Timer1.Stop()
    10. btn_A_1Ausfahrt.Enabled = False
    11. Parkhaus._Stellplätze = 5
    12. lb_freiStellplatz.Text = "Freie Stellplätze: " & Parkhaus._Stellplätze
    13. lb_Gesamtautos.Text = "Anzahl gesammt: " & Parkhaus._Zählerausfahrt
    14. 'Anzahl der Stellplätze ( Erweiterung )
    15. 'cmb_stellplätze.DataSource = "2 5 10 15 20".Split
    16. End Sub
    17. Friend Sub Schrankenzeiten()
    18. Select Case True
    19. Case btn_E_1EinfahrtAlreadyClicked
    20. Dim _Ort = Gebäude.Standort.Einfahrt
    21. Parkhaus.Index = 1 - Parkhaus.Index
    22. Parkhaus._neuStatus = CType(Parkhaus.Index, Gebäude.Schrankenstatus)
    23. Timer1.Interval = Parkhaus._Schrankenphasen(Parkhaus.Index)
    24. Parkhaus.Schrankensteuerung(_Ort, Parkhaus._neuStatus)
    25. btn_E_1EinfahrtAlreadyClicked = False
    26. Case btn_A_1AusfahrtAlreadyClicked
    27. Dim _Ort = Gebäude.Standort.Ausfahrt
    28. Parkhaus.Index = 1 - Parkhaus.Index
    29. Parkhaus._neuStatus = CType(Parkhaus.Index, Gebäude.Schrankenstatus)
    30. Timer1.Interval = Parkhaus._Schrankenphasen(Parkhaus.Index)
    31. Parkhaus.Schrankensteuerung(_Ort, Parkhaus._neuStatus)
    32. btn_A_1AusfahrtAlreadyClicked = False
    33. End Select
    34. End Sub
    35. Friend Sub Steurungsignalgeber()
    36. btn_E_1Einfahrt.Enabled = Parkhaus._Stellplätze > 0
    37. If Parkhaus._Stellplätze = 5 Then
    38. btn_A_1Ausfahrt.Enabled = False
    39. ElseIf Parkhaus._Stellplätze < 4 Then
    40. btn_A_1Ausfahrt.Enabled = True
    41. Else
    42. btn_A_1Ausfahrt.Enabled = True
    43. End If
    44. End Sub
    45. Friend Sub Anzeigen(ByVal AnzeigeAmpel As Gebäude.Ampelsignal)
    46. Select Case AnzeigeAmpel
    47. Case Gebäude.Ampelsignal.Grün
    48. 'Anzeige ein Bild oder ....
    49. Case Gebäude.Ampelsignal.Rot
    50. 'Anzeige ein Bild oder ....
    51. End Select
    52. End Sub
    53. Friend Sub AnzeigeZähler()
    54. lb_freiStellplatz.Text = "Freie Stellplätze: " & Parkhaus._Stellplätze
    55. lb_Gesamtautos.Text = " Anzahl gesammt: " & Parkhaus._Zählerausfahrt
    56. End Sub
    57. Private Sub btn_E_1Einfahrt_Click(sender As Object, e As EventArgs) Handles btn_E_1Einfahrt.Click
    58. btn_A_1AusfahrtAlreadyClicked = False
    59. btn_E_1EinfahrtAlreadyClicked = True
    60. Timer1.Start()
    61. Parkhaus.Stellplatzzähler(-1)
    62. End Sub
    63. Private Sub btn_A_1Ausfahrt_Click(sender As Object, e As EventArgs) Handles btn_A_1Ausfahrt.Click
    64. btn_A_1AusfahrtAlreadyClicked = True
    65. btn_E_1EinfahrtAlreadyClicked = False
    66. Timer1.Start()
    67. Parkhaus.Stellplatzzähler(1)
    68. End Sub
    69. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    70. Schrankenzeiten()
    71. End Sub
    72. End Class
    73. Public Class Gebäude
    74. Public Enum Ampelsignal : Rot : Grün : End Enum
    75. Public Enum Standort : Einfahrt : Ausfahrt : End Enum
    76. Public Enum Schrankenstatus : geschlossen : offen : End Enum
    77. Public _neuOrt As Standort = Standort.Einfahrt
    78. Public _neuStatus As Schrankenstatus = Schrankenstatus.offen
    79. Public _Ort As String
    80. Public Index As Integer = 0
    81. Public _Schrankenphasen() As Integer = {3000, 2000}
    82. Public _Zählerausfahrt As Integer = 0
    83. Public _Stellplätze As Integer
    84. 'Public varStellPlatz As Integer
    85. 'Public varStellPlatz2 As Integer
    86. 'Public _anzahl As String
    87. Public Sub Stellplatzzähler(ByVal difference As Integer)
    88. _Stellplätze += difference
    89. Select Case difference
    90. Case < 0
    91. If _Stellplätze = 0 Then
    92. frm_main.Anzeigen(Ampelsignal.Rot)
    93. Else
    94. frm_main.Anzeigen(Ampelsignal.Grün)
    95. End If
    96. Case > 0
    97. _Zählerausfahrt += difference
    98. End Select
    99. frm_main.AnzeigeZähler()
    100. frm_main.Steurungsignalgeber()
    101. End Sub
    102. Public Sub Schrankensteuerung(ByVal ort As Standort, status As Schrankenstatus)
    103. Select Case ort
    104. Case Standort.Einfahrt
    105. Select Case status
    106. Case Schrankenstatus.offen
    107. 'tue etwas
    108. Case Schrankenstatus.geschlossen
    109. 'tue etwas
    110. End Select
    111. Case Standort.Ausfahrt
    112. Select Case status
    113. Case Schrankenstatus.offen
    114. 'tue etwas
    115. Case Schrankenstatus.geschlossen
    116. 'tue etwas
    117. End Select
    118. Case Else
    119. 'Für Ausnahmezustände
    120. End Select
    121. End Sub
    122. End Class
    Und:
    Benenn bitte diesen Deinen Thread um, z.B. in Modell für ein Parkhaus
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Amelie schrieb:

    Dim Parkhaus As New Gebäude
    Ehm … naja. Unglückliche Bezeichnung der Klasse. Weil: Ein Einfamilienhaus ist auch ein Gebäude, kann aber nicht sinnvoll ein Objekt Deiner Gebäudeklasse sein, weil es keine Schranken, Lichtanlagen oder Stellplätze hat. Letzteres zumindest nicht immer. Daher wäre eine bessere Benennung (meines Erachtens): Public Class Parkhaus und Dim ParkhausInDerSchlossAlleeInBerlin As New Parkhaus.

    VB.NET-Quellcode

    1. If Parkhaus._Stellplätze = 5 Then
    2. btn_A_1Ausfahrt.Enabled = False
    3. ElseIf Parkhaus._Stellplätze < 4 Then
    4. btn_A_1Ausfahrt.Enabled = True
    5. Else
    6. btn_A_1Ausfahrt.Enabled = True
    7. End If
    Wofür ist der Else-Fall? Doch nur, wenn Parkhaus._Stellplätze > 5 ist oder wenn Parkhaus._Stellplätze = 4. Ergibt das Sinn?

    ByVal brauchst Du nicht.

    ByVal difference As Integer - Alles auf deutsch, nur nicht dieser Parameter …

    _Zählerausfahrt = _Zählerausfahrt + 1 -> _Zählerausfahrt += 1

    Und: Arbeite an der Benennung Deiner Subs: Schrankenzeiten ?( Ein Sub-Name sollte zeigen, was die Sub macht. Ein Function-Name sollte zeigen, was die Function zurückliefert
    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“ ()

    Hatte ich ganz vergessen.
    Hier meine fertige Parkhaussimulation. :)

    Anhang mit ausführbaren Dateien sind außerhalb des Showrooms nicht zulässig - alternativ einfach das Projekt anhängen ~VaporiZed
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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