Numeric-Up-Dows für Zeitdauern

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Numeric-Up-Dows für Zeitdauern

    Hi all,

    kurze Frage: gibt es hierfür etwas Fertiges?

    Ich habe drei Numeric-Up-Downs für h, min und sec. Ich verwerte alle drei Value-Changed-Events und der Code lässt den nächstgrößeren NUD umspringen, wenn der kleinere die 60 erreichen würde. Beispiel: Das Sekunden-NUD steht auf 59 Sekunden, man inkrementiert, sodass es wieder auf 0 springt und der Minuten-NUD um 1 inkrementiert wird. Dasselbe für die Minuten vs Stunden und das Ganze auch rückwärts. Das war nun nicht besonders viel Aufwand, aber ich wollte mal fragen, ob es bereits etwas Fertiges gibt und ob ihr noch Sachen habt, die eurer Meinung nach nicht fehlen dürfen (stellt euch vor, ihr habt ein Gerät vor euch und müsstet das einstellen: Was wäre der größte Graus)

    Viele Grüße

    Bartosz

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub NUD_h_ValueChanged(sender As Object, e As EventArgs) Handles NUD_h.ValueChanged
    3. If NUD_h.Value = 24 Then
    4. NUD_h.Value = 23
    5. End If
    6. If NUD_h.Value = -1 Then
    7. NUD_h.Value = 0
    8. NUD_min.Value = 59
    9. End If
    10. Gesamt()
    11. End Sub
    12. Private Sub NUD_min_ValueChanged(sender As Object, e As EventArgs) Handles NUD_min.ValueChanged
    13. If NUD_min.Value = 60 Then
    14. NUD_min.Value = 0
    15. NUD_h.Value += 1
    16. End If
    17. If NUD_min.Value = -1 Then
    18. NUD_min.Value = 0
    19. NUD_sec.Value = 59
    20. End If
    21. Gesamt()
    22. End Sub
    23. Private Sub NUD_sec_ValueChanged(sender As Object, e As EventArgs) Handles NUD_sec.ValueChanged
    24. If NUD_sec.Value = 60 Then
    25. NUD_sec.Value = 0
    26. NUD_min.Value += 1
    27. End If
    28. If NUD_sec.Value = -1 Then
    29. NUD_sec.Value = 59
    30. End If
    31. Gesamt()
    32. End Sub
    33. Private Sub Gesamt()
    34. Dim Zeitdauer_s As Integer = CInt(NUD_sec.Value + NUD_min.Value * 60 + NUD_h.Value * 3600)
    35. Label4.Text = Zeitdauer_s.ToString
    36. End Sub
    37. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    38. Label4.Text = ""
    39. End Sub
    40. End Class


    Editor-Bugs entfernt. ~Thunderbolt/EaranMaleasi
    Bilder
    • Screenshot 2020-10-13 204942.png

      6,4 kB, 612×315, 37 mal angesehen
    • Screenshot 2020-10-13 204912.png

      6,21 kB, 607×317, 40 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Zeile#4-#10 kapier ich nicht. Das kann doch durch Minimum und Maximum verhindert/eingestellt werden.
    Was passiert eine Sekunde nach 23:59:59? Ist das Verhalten mit derzeitigem Code gewollt?
    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.
    Was passiert eine Sekunde nach 23:59:59?
    Ich habe mir gedacht, dass dann in diesem Testprojekt Schluss ist. Sicherlich könnte man einen vierten NUD für Tage einbauen; aber so kann man nur ≈ 1 Tag einstellen (23:59:59). Mir fiel dazu gerade auf, dass in dem Fall (also Stunde = 23) die Minuten auch auf 59 stehen bleiben müssten – statt auf 0 zurückzukehren.

    Das kann doch durch Minimum und Maximum verhindert/eingestellt werden.
    Naja, ich muss die Zahlen eh im Code benutzen, von daher...

    ==========
    Ich habe den Code nun abgeändert. Nach 23:59:59 kann nichts mehr genullt werden – damit ist optisch für den Benutzer Schluss. Beispiel: alles steht auf 0. Ich kann allein mit dem Sekunden-NUD alles inkrementieren, bis ich bei 23:59:59 bin. Ebenso kann ich alles mit dem Minuten-NUD inkrementieren, bis ich bei 23:59:00 bin (und dann die 59 Sekunden mit dem Sek.-NUD machen). Nur dass dann Schluss ist.

    Dekrementieren geht folgendermaßen: Stunde sei auf 1, Min auf 0. Wenn ich bei Min-NUD dekrementiere, wird Stunde auch dekrementiert, Min auf 59 gesetzt. Das geht immer, außer wenn das nächsthöhere (hier Stunde) bereits auf 0 ist. Nächstes Beispiel: Minute steht auf 1, Sek. auf 0. Dann kann ich mit dem Sek-NUD dekrementieren. Min geht auf 0 und Sek auf 59. Das geht auch immer, außer wenn Minuten und Stunden bereits auf 0 sind. Somit ist optisch Schluss, wenn alles auf 00:00:00 steht (ich meine, dass nichts mehr auf 59 springt).

    Meine Frage ist an euch, ob ihr es genau so handhabt. Je mehr ich darüber nachdenke, desto unsicherer werde ich <X
    Ich habe es so gemacht: Der kleinere kann den größeren dekrementieren, aber der größere nicht den kleineren beeinflussen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub NUD_h_ValueChanged(sender As Object, e As EventArgs) Handles NUD_h.ValueChanged
    3. If NUD_h.Value = 24 Then
    4. NUD_h.Value = 23
    5. End If
    6. If NUD_h.Value = -1 Then
    7. NUD_h.Value = 0
    8. ''NUD_min.Value = 59 'lieber nicht :D
    9. End If
    10. Gesamt()
    11. End Sub
    12. Private Sub NUD_min_ValueChanged(sender As Object, e As EventArgs) Handles NUD_min.ValueChanged
    13. 'Inkremente
    14. If NUD_min.Value = 60 AndAlso NUD_h.Value = 23 Then
    15. NUD_min.Value = 59
    16. ElseIf NUD_min.Value = 60 Then
    17. NUD_min.Value = 0
    18. NUD_h.Value += 1
    19. End If
    20. 'Dekremente
    21. If NUD_min.Value = -1 AndAlso NUD_h.Value > 0 Then
    22. NUD_min.Value = 59
    23. NUD_h.Value = NUD_h.Value - 1
    24. ElseIf NUD_min.Value = -1 Then
    25. NUD_min.Value = 0
    26. End If
    27. Gesamt()
    28. End Sub
    29. Private Sub NUD_sec_ValueChanged(sender As Object, e As EventArgs) Handles NUD_sec.ValueChanged
    30. 'Inkremente
    31. If NUD_sec.Value = 60 AndAlso NUD_min.Value = 59 AndAlso NUD_h.Value = 23 Then
    32. NUD_sec.Value = 59
    33. ElseIf NUD_sec.Value = 60 Then
    34. NUD_sec.Value = 0
    35. NUD_min.Value += 1
    36. End If
    37. 'Dekremente
    38. If NUD_sec.Value = -1 AndAlso NUD_min.Value > 0 AndAlso NUD_h.Value > 0 Then
    39. NUD_sec.Value = 59
    40. NUD_min.Value = NUD_min.Value - 1
    41. If NUD_min.Value = (-1) Then
    42. NUD_h.Value = NUD_h.Value - 1
    43. End If
    44. ElseIf NUD_sec.Value = -1 AndAlso NUD_min.Value = 0 AndAlso NUD_h.Value > 0 Then
    45. NUD_h.Value = NUD_h.Value - 1
    46. NUD_min.Value = 59
    47. NUD_sec.Value = 59
    48. ElseIf NUD_sec.Value = -1 AndAlso NUD_min.Value > 0 AndAlso NUD_h.Value = 0 Then
    49. NUD_min.Value = NUD_min.Value - 1
    50. NUD_sec.Value = 59
    51. ElseIf NUD_sec.Value = -1 Then
    52. NUD_sec.Value = 0
    53. End If
    54. Gesamt()
    55. End Sub
    56. Private Sub Gesamt()
    57. Dim Zeitdauer_s As Integer = CInt(NUD_sec.Value + NUD_min.Value * 60 + NUD_h.Value * 3600)
    58. Label4.Text = Zeitdauer_s.ToString
    59. End Sub
    60. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    61. Label4.Text = ""
    62. End Sub
    63. End Class

    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Bartosz“ ()

    @Bartosz Deine Zuordnung ist falsch.
    Wenn Dein Stunden-Control von 23 auf 24 geht, muss es 0 anzeigen und das nächst höhere muss inkrementiert werden.
    Wenn Dein Stunden-Control von 0 auf -1 geht, muss es 23 anzeigen und das nächst höhere muss dekrementiert werden.
    usw.
    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!
    Wenn Dein Stunden-Control von 23 auf 24 geht, muss es 0 anzeigen und das nächst höhere muss inkrementiert werden.
    Wenn Dein Stunden-Control von 0 auf -1 geht, muss es 23 anzeigen und das nächst höhere muss dekrementiert werden.
    Das habe ich gemacht (Post 3).
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Bartosz schrieb:

    Das habe ich gemacht
    Ja und?
    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 meinte damit, mein Code verhält sich so, wie du sagst. :)
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.