Prüfen wenn Schaltjahr

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von AndPod.

    Prüfen wenn Schaltjahr

    Hallo
    hab es hinbekommen das ich aus drei Comboboxen
    das Datum im Label anzeigt.

    Problem ist das Prüfen von Schaltjahr.

    Mein Code

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'Combobox cbJahre füllen
    3. For y = 1900 To 2100
    4. cbJahre.Items.Add(y)
    5. Next y
    6. 'Combobox cbMonate füllen
    7. For m = 1 To 12
    8. cbMonate.Items.Add(MonthName(m)).ToString("MMMM")
    9. Next m
    10. 'Combobox cbTage füllen
    11. For d = 1 To 31
    12. cbTage.Items.Add(d)
    13. Next
    14. 'Text Select
    15. cbJahre.SelectedText = DateTime.Now.Year.ToString
    16. cbMonate.SelectedText = (MonthName(DateTime.Now.Month)).ToString
    17. cbTage.SelectedText = DateTime.Now.Day.ToString
    18. 'Datum anzeigen im Label
    19. labelanzeige()
    20. End Sub
    21. Private Sub cbJahre_SelectedValueChanged(sender As Object, e As EventArgs) Handles cbJahre.SelectedValueChanged
    22. labelanzeige()
    23. End Sub
    24. Private Sub cbMonate_SelectedValueChanged(sender As Object, e As EventArgs) Handles cbMonate.SelectedValueChanged
    25. If Date.IsLeapYear(CInt(cbJahre.SelectedText)) = False And CInt(cbMonate.SelectedText) = CInt("Februar") And CInt(cbTage.SelectedText) > CInt("28") Then
    26. MessageBox.Show(cbJahre.SelectedText & " ist kein Schaltjahr")
    27. Exit Sub
    28. Else
    29. labelanzeige()
    30. End If
    31. End Sub
    32. Private Sub cbTage_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbTage.SelectedIndexChanged
    33. labelanzeige()
    34. End Sub
    35. Sub labelanzeige()
    36. jahr = CInt(cbJahre.Text)
    37. tage = CInt(cbTage.Text)
    38. Select Case cbMonate.Text
    39. Case "Januar"
    40. monat = 1
    41. j = New DateTime(jahr, monat, tage)
    42. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    43. Case "Februar"
    44. monat = 2
    45. j = New DateTime(jahr, monat, tage)
    46. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    47. Case "März"
    48. monat = 3
    49. j = New DateTime(jahr, monat, tage)
    50. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    51. Case "April"
    52. monat = 4
    53. j = New DateTime(jahr, monat, tage)
    54. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    55. Case "Mai"
    56. monat = 5
    57. j = New DateTime(jahr, monat, tage)
    58. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    59. Case "Juni"
    60. monat = 6
    61. j = New DateTime(jahr, monat, tage)
    62. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    63. Case "Juli"
    64. monat = 7
    65. j = New DateTime(jahr, monat, tage)
    66. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    67. Case "August"
    68. monat = 8
    69. j = New DateTime(jahr, monat, tage)
    70. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    71. Case "September"
    72. monat = 9
    73. j = New DateTime(jahr, monat, tage)
    74. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    75. Case "Oktober"
    76. monat = 10
    77. j = New DateTime(jahr, monat, tage)
    78. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    79. Case "November"
    80. monat = 11
    81. j = New DateTime(jahr, monat, tage)
    82. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    83. Case "Dezember"
    84. monat = 12
    85. j = New DateTime(jahr, monat, tage)
    86. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    87. End Select
    88. End Sub


    L.G. Willi
    Ok, dann zu deinem Problem:

    papawt schrieb:

    Problem ist das Prüfen von Schaltjahr.


    Was ist das Problem? Ich sehe hier nur Code und keine Fehlermeldung (ja auch wenn man sieht was falsch ist würde ich gerne vom TE selbst eine Fehlermeldung hier stehen haben).
    Bitte immer daran denken das du vor deiner IDE sitzt und du die Fehler ausgespuckt bekommst die für uns wichtig sind.

    Also sage uns was genau nicht funktioniert und wo was für ein Fehler kommt dann können wir weiter machen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    jup weil selectedText leer ist.

    selectedText ist leer sobald die combobox den Fokus verliert.

    wenn du den Text willst der da grad ausgewählt ist nimm einfach cbjahre.text

    lies dir dazu auch gerne mal die msdn Artikel zu selectedText und Text durch bin grad am Handy bissl doof da links zu posten.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Eine Frage zwischendurch @papawt: Was soll z.B. dieser Codebereich bedeuten: CInt(cbMonate.SelectedText) = CInt("Februar")?
    Das gibt bei mir zur Laufzeit ne Exception, unabhängig von Option Strict.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi
    CInt(cbMonate.SelectedText) = CInt("Februar") soll bedeuten wenn
    Februar ausgewählt wird.

    hab eben festgestellt das das Problem nicht nur bei Schaltjahr ist sondern
    auch wenn ich einen Tag auswähle der größer ist als das ausgewählte Monat.

    L.G. Willi

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

    Ne, eben nicht. Der Teil bedeutet: "Wandle den ausgewählten Text der ComboBox in eine Ganzzahl um. Und wandle das Wort 'Februar' in eine Ganzzahl um. Und dann vergleiche die beiden Zahlen miteinander."
    Man kann den String "2" in eine Ganzzahl umwandeln (das ergibt 2). Und auch z.B. "2.1232" (-> auch 2 oder 21232, ist kulturspezifisch). Da man das Wort "Februar" aber nicht umwandeln kann, genauso wenig wie das Wort "Birne", ist dieser Codeteil Humbug.
    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.
    Für diesen Teil: Lass das Cint einfach weg. Wenn, dann willst Du ja schauen, ob in der ComboBox z.B. "Februar" drinsteht. Aber da könnte vieles in Deinem Code anders/besser/kürzer geschrieben werden. Nur fehlt mir momentan leider die Zeit dafür.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi
    hab jetzt den Code geändert und es scheint zu funktionieren.

    VB.NET-Quellcode

    1. Sub labelanzeige()
    2. jahr = CInt(cbJahre.Text)
    3. tage = CInt(cbTage.Text)
    4. Select Case cbMonate.Text
    5. Case "Januar"
    6. monat = 1
    7. j = New DateTime(jahr, monat, tage)
    8. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    9. Case "Februar"
    10. monat = 2
    11. If Date.IsLeapYear(jahr) = False And tage > 28 Then
    12. MessageBox.Show("Februar" & " ist kein Schaltjahr")
    13. Exit Sub
    14. Else
    15. If Date.IsLeapYear(jahr) = True And tage > 29 Then
    16. MessageBox.Show("Februar" & " hat nur 29 Tage")
    17. Exit Sub
    18. End If
    19. End If
    20. j = New DateTime(jahr, monat, tage)
    21. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    22. Case "März"
    23. monat = 3
    24. j = New DateTime(jahr, monat, tage)
    25. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    26. Case "April"
    27. monat = 4
    28. If tage > 30 Then
    29. MessageBox.Show("April" & " hat nur 30 Tage")
    30. End If
    31. Exit Sub
    32. j = New DateTime(jahr, monat, tage)
    33. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    34. Case "Mai"
    35. monat = 5
    36. j = New DateTime(jahr, monat, tage)
    37. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    38. Case "Juni"
    39. monat = 6
    40. If tage > 30 Then
    41. MessageBox.Show("Juni" & " hat nur 30 Tage")
    42. End If
    43. Exit Sub
    44. j = New DateTime(jahr, monat, tage)
    45. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    46. Case "Juli"
    47. monat = 7
    48. j = New DateTime(jahr, monat, tage)
    49. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    50. Case "August"
    51. monat = 8
    52. j = New DateTime(jahr, monat, tage)
    53. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    54. Case "September"
    55. monat = 9
    56. If tage > 30 Then
    57. MessageBox.Show("September" & " hat nur 30 Tage")
    58. End If
    59. Exit Sub
    60. j = New DateTime(jahr, monat, tage)
    61. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    62. Case "Oktober"
    63. monat = 10
    64. j = New DateTime(jahr, monat, tage)
    65. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    66. Case "November"
    67. monat = 11
    68. If tage > 30 Then
    69. MessageBox.Show("November" & " hat nur 30 Tage")
    70. End If
    71. Exit Sub
    72. j = New DateTime(jahr, monat, tage)
    73. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    74. Case "Dezember"
    75. monat = 12
    76. j = New DateTime(jahr, monat, tage)
    77. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    78. End Select
    79. End Sub


    L.G. Willi

    AndPod schrieb:

    und nicht einfach am Ende?
    Weil da überall ein

    papawt schrieb:

    VB.NET-Quellcode

    1. Exit Sub
    drinne steht.
    @papawt Die vielen Exit Sub gehören in den If-Block hinein.
    Mit NumericUpDown-Controls statt der TextBoxen für Tag und Jahr sähe dann der Code so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private UseIt As Boolean = False
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    4. UseIt = True
    5. cbMonate.SelectedIndex = 0
    6. End Sub
    7. Private Sub nudJahre_ValueChanged(sender As Object, e As EventArgs) Handles nudJahre.ValueChanged, cbMonate.SelectedIndexChanged, nudTage.ValueChanged
    8. If Not UseIt Then
    9. ' initial Zugriff mit falschen Werten verhindern
    10. Return
    11. End If
    12. Dim jahr = CInt(nudJahre.Value)
    13. Dim tage = CInt(nudTage.Text)
    14. Dim monat As Integer
    15. Select Case cbMonate.Text
    16. Case "Januar"
    17. monat = 1
    18. Case "Februar"
    19. monat = 2
    20. If Not Date.IsLeapYear(jahr) AndAlso tage > 28 Then
    21. MessageBox.Show("Februar ist kein Schaltjahr")
    22. Exit Sub
    23. ElseIf Date.IsLeapYear(jahr) AndAlso tage > 29 Then
    24. MessageBox.Show("Februar hat nur 29 Tage")
    25. Exit Sub
    26. End If
    27. Case "März"
    28. monat = 3
    29. Case "April"
    30. monat = 4
    31. If tage > 30 Then
    32. MessageBox.Show("April hat nur 30 Tage")
    33. Exit Sub
    34. End If
    35. Case "Mai"
    36. monat = 5
    37. Case "Juni"
    38. monat = 6
    39. If tage > 30 Then
    40. MessageBox.Show("Juni hat nur 30 Tage")
    41. Exit Sub
    42. End If
    43. Case "Juli"
    44. monat = 7
    45. Case "August"
    46. monat = 8
    47. Case "September"
    48. monat = 9
    49. If tage > 30 Then
    50. MessageBox.Show("September hat nur 30 Tage")
    51. Exit Sub
    52. End If
    53. Case "Oktober"
    54. monat = 10
    55. Case "November"
    56. monat = 11
    57. If tage > 30 Then
    58. MessageBox.Show("November hat nur 30 Tage")
    59. Exit Sub
    60. End If
    61. Case "Dezember"
    62. monat = 12
    63. End Select
    64. Dim j = New DateTime(jahr, monat, tage)
    65. lblDatumAnzeige.Text = j.ToString(" dddd dd MMMM yyyy")
    66. End Sub
    67. End Class
    ================
    Elegant wäre es natürlich, wenn Du in Abhängigkeit des Jahres und des Monats das .Maximum der NumericUpDown auf die Anzahl der Tage im Monat setzt, da musst Du nix mehr testen, es läuft einfach so.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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

    Hi
    @AndPod : Grund dafür war das ich das nicht gewusst hab.
    @RodFromGermany : es sind alle drei Comboboxen,es sind keine Textboxen.
    Hab deinen Code mit NumeicUpDown ausprobiert was auch funktioniert,
    aber anstatt NumericUpDown werde ich doch lieber Comboboxen benutzen.

    Danke noch einmal für eure Tipps und Hilfe, damit glaube ich kann das
    Thema geschlossen werden.

    L.G. Willi

    RodFromGermany schrieb:

    AndPod schrieb:

    und nicht einfach am Ende?
    Weil da überall ein

    papawt schrieb:

    VB.NET-Quellcode

    1. Exit Sub
    drinne steht.


    Das Exit Sub greift ja, wenn eine falsche Kombi ausgewählt wurde. In dem Fall wird auch kein Label geschrieben.
    Aber wie er ja schon schrieb, ihm war es schlicht nicht bewusst.