ChangeEvent von mehreren Textboxen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    DerSmurf schrieb:

    wenn ich versuche auf "backspace" zu prüfen
    machst Du:

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.Back Then
    Wenn Du den Namen einer Taste suchst, mach Dir ein separates Projekt mit TextBox und Label und dann

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    2. Label1.Text = e.KeyCode.ToString()
    3. End Sub
    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!
    Danke VB1963, das mit dem Binden klingt gut - werde ich nachher mal googlen und versuchen umzusetzen.
    Wenn nur mit numerical up and down in Binding als Double möglich ist, überlege ich mir das nochmal.
    Aber mich stören die beiden hoch und runter Pfeile schon extrem, ich finde keine Möglichkeit diese zu deaktivieren.

    Ansonsten verwende ich den Code vom Rod (der in Textbox nur numerische Eingabe und Backspace zulässt) und speichere die Zeit eben als String.
    Ist ja kein Aufwand dann bei jedem Zugriff über Integer.Parse eine integer draus zu machen (so werden die Werte bisher gespeichert)

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

    Huhu
    Danke für den Link, hat mir das googlen gespart :o)
    Ich habe die restlichen beiden Elemente in meiner Einstellungen Form (eine Checkbox und ein Numeric up and down) nun an die Settings gebunden.
    Weil die NUD ja nunmal das richige Control für meinen Zweck ist, wollte ich meine 18 Textboxen löschen und durch NUDs erstzen (und halt mit den Pfeilen leben), diese wollte ich dann an die entsprechenden Settings binden. Btw ich kann NUDs nur an Decimal Settings binden, nicht an double.
    Aber hierzu leider noch eine Grundsatzfrage am konkreten Beispiel:
    My.Settings.Temp95 (decimal) speichert die Sekunden, zusammengesetzt aus den beiden Textboxen Temp95Min und Temp95Sek

    Quellcode

    1. My.Settings.Temp95 = Integer.Parse(TB95Min.Text) * 60 + Integer.Parse(TB95Sek.Text)

    Mit diesem Code fällt ja das Binding weg, denn ich kann ja nicht zwei Textboxen (oder eben NUDs) an eine Setting binden :(

    Nun meine Grundsatzfrage:
    Ist es sinnvoller möglichst wenig in my.Settings zu speichern, oder ist das wurscht?
    Soll ich also statt Temp95 in Sekunden, durch Temp95 Minuten UND Sekunden ersetzen, und dann in Sekunden umrechnen, wenn ich es brauche, oder ist es besser dies direkt so zu speichern, wie ich es später verwenden werde?

    edit: @RodFromGermany Danke für den Tipp!

    edit2: Hier ein wenig Code:
    Der Code zum lesen und speichern von My.Settings in der Einstellungen Form:
    Spoiler anzeigen

    Quellcode

    1. Private Abkuehlzeitgeaendert As Boolean = False
    2. 'Form Load Event
    3. Private Sub fProgrammeinstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'Laden der Einstellungen aus My.Settings
    5. 'Abkühlzeiten
    6. Abkuehlzeitschreiben(My.Settings.Temp95, TB95Min, TB95Sek)
    7. Abkuehlzeitschreiben(My.Settings.Temp90, TB90Min, TB90Sek)
    8. Abkuehlzeitschreiben(My.Settings.Temp85, TB85Min, TB85Sek)
    9. Abkuehlzeitschreiben(My.Settings.Temp80, TB80Min, TB80Sek)
    10. Abkuehlzeitschreiben(My.Settings.Temp75, TB75Min, TB75Sek)
    11. Abkuehlzeitschreiben(My.Settings.Temp70, TB70Min, TB70Sek)
    12. Abkuehlzeitschreiben(My.Settings.Temp65, TB65Min, TB65Sek)
    13. Abkuehlzeitschreiben(My.Settings.Temp60, TB60Min, TB60Sek)
    14. End Sub

    Quellcode

    1. 'Subs und Funktionen
    2. Private Sub Abkuehlzeitschreiben(Temp As Integer, TBMin As TextBox, TBSek As TextBox)
    3. If Temp >= 60 Then
    4. TBMin.Text = (Temp \ 60).ToString
    5. TBSek.Text = (Temp Mod 60).ToString
    6. Else
    7. TBSek.Text = Temp.ToString
    8. TBMin.Text = "0"
    9. End If
    10. End Sub

    Quellcode

    1. 'Klick Events Buttons
    2. Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
    3. 'Speichern in My.Settings
    4. 'Abkuehlzeiten nur speichern, wenn globale boolean True
    5. If Abkuehlzeitgeaendert = True Then
    6. My.Settings.Temp95 = Integer.Parse(TB95Min.Text) * 60 + Integer.Parse(TB95Sek.Text)
    7. My.Settings.Temp90 = Integer.Parse(TB90Min.Text) * 60 + Integer.Parse(TB90Sek.Text)
    8. My.Settings.Temp85 = Integer.Parse(TB85Min.Text) * 60 + Integer.Parse(TB85Sek.Text)
    9. My.Settings.Temp80 = Integer.Parse(TB80Min.Text) * 60 + Integer.Parse(TB80Sek.Text)
    10. My.Settings.Temp75 = Integer.Parse(TB75Min.Text) * 60 + Integer.Parse(TB75Sek.Text)
    11. My.Settings.Temp70 = Integer.Parse(TB70Min.Text) * 60 + Integer.Parse(TB70Sek.Text)
    12. My.Settings.Temp65 = Integer.Parse(TB65Min.Text) * 60 + Integer.Parse(TB65Sek.Text)
    13. My.Settings.Temp60 = Integer.Parse(TB60Min.Text) * 60 + Integer.Parse(TB60Sek.Text)
    14. End If
    15. Me.Close()
    16. End Sub


    und hier die Verwendung dieser Settings im Programm.
    lblTemperatur ist ein Label, einstellbar zwischen 100 und 60 in 5er Schritten durch zwei buttons.
    lblAbkuehlzeitMin und lblAbkuehlzeitSek sind zwei Label für die Abkühlzeit des Wassers in Minuten und Sekunden:

    Spoiler anzeigen

    Quellcode

    1. 'Change Events
    2. Private Sub lblTemperatur_TextChanged(sender As Object, e As EventArgs) Handles lblTemperatur.TextChanged
    3. 'Temperatur aus lblTemperatur auslesen und Abkuehlzeit entsprechend ändern
    4. Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
    5. Select Case Temperatur
    6. Case = 100 : TemperaturinZeit(0)
    7. Case = 95 : TemperaturinZeit(My.Settings.Temp95)
    8. Case 90 : TemperaturinZeit(My.Settings.Temp90)
    9. Case = 85 : TemperaturinZeit(My.Settings.Temp85)
    10. Case = 80 : TemperaturinZeit(My.Settings.Temp80)
    11. Case = 75 : TemperaturinZeit(My.Settings.Temp75)
    12. Case = 70 : TemperaturinZeit(My.Settings.Temp70)
    13. Case = 65 : TemperaturinZeit(My.Settings.Temp65)
    14. Case 60 : TemperaturinZeit(My.Settings.Temp60)
    15. End Select
    16. End Sub


    Quellcode

    1. Private Sub TemperaturinZeit(Zeit As Integer)
    2. 'Sub zum ändern der Abkühlzeit je nach Temperatur
    3. If Zeit >= 60 Then
    4. 'Umwandeln der Sekunden in Minuten und Sekunden
    5. lblAbkuehlzeitMinuten.Text = (Zeit \ 60).ToString
    6. lblAbkuehlzeitSekunden.Text = (Zeit Mod 60).ToString
    7. Else
    8. lblAbkuehlzeitSekunden.Text = Zeit.ToString
    9. End If
    10. End Sub


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

    Einige Fragen zu deinem Unterfangen, wenn ich die Textboxen von Temp60 bis 95 immer anschaue:
    Hat das einen bestimmten Grund diese Temperatur in 5Grad-Schritten abgesetzt darzustellen?
    Genügt es nicht, diesen Wert in einer einzigen Textbox zu zeigen?
    Oder versteckt sich hier eine unbewusste Tabelle?
    Kannst du von deiner Form ein Bildchen zeigen?

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

    @DerSmurf Trenne Daten und GUI.
    Du rechnest mit dem Inhalt von TextBoxen. Das ist suboptimal, z.B. wenn Du Fehler suchst.
    Halte Daten in Variablen entsprechenden Typs, die kannst Du dann auch in Settings ablegen: System.TimeSpan. Da hast Du einen Wert, von dem Du die Stunden, Minuten und Sekunden abfragen kannst.
    Und wnn Du Dir ein geeignetes Control baust, hast Du sehr viel weniger Aufwand mit Deinen Berechnungen.
    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!
    Habe ein Bild der Hauptform, sowie der Einstellungen Form hochgeladen.
    Erklärung was da was tut ist auf den Bildern.
    Hintergrund der Geschichte ist, dass ich, sobald das Problem hier geklärt ist, eine Speichermöglichkeit für verschiedene Tee Sorten (Name, Temperatur und Ziehzeit) mit Auswahl hinzufügen möchte (dann habe ich durch dieses Projekt recht viel neues gelernt)
    Und zum Verständnis, was das so soll hier ein Beispiel an einem meiner Lieblingstees:
    Name: Le Touareg
    Temperatur: 90°
    Ziehzeit: 2 Min
    Also klicke ich zweimal auf den Minusbutton bei Temperatur um 90° einzustellen, die mein Wasser haben sollte.
    Es ändern sich die entsprechenden Labels für Abkühlzeit.
    Danach stelle ich die Ziehzeit aus 2 Min und starte.
    Eine neue Form mit Timer (Abkühlzeit) zeigt sich und beginnt zu laufen. Ist der Timer auf 0 gibts eine Meldung welche bestätigt werden möchte.
    Erfolgt dies wird die Timerform geschlossen und eine neue Instanz dieser geöffnet, diesmal mit Timer für die Ziehzeit.

    Nun möchte ich diese Abkühlzeiten (im Bereich 95° - 60° - drunter macht wenig Sinn für Tee) einstellbar machen.

    Wie erwähnt nicht über Sinn- oder Unsinn der Funktionalität nachdenken - mit gehts ums lernen, ich will Settings speichern.

    So und hier dann noch der Code aus den beiden Forms (den Timer an sich - separate Form - habe ich jetzt mal weggelassen, denke mir der spielt keine Rolle, reiche ich aber gerne nach)

    Code der Hauptform:
    Spoiler anzeigen

    Quellcode

    1. Public Class fEinstellungen
    2. 'Klick Events - Buttons
    3. Private Sub btnTemperaturMinus_Click(sender As Object, e As EventArgs) Handles btnTemperaturMinus.Click
    4. 'verringert Temperatur um 5°
    5. Temperaturaendern(-5)
    6. End Sub
    7. Private Sub btnTemperaturPlus_Click(sender As Object, e As EventArgs) Handles btnTemperaturPlus.Click
    8. 'erhöht Temperatur um 5°
    9. Temperaturaendern(5)
    10. End Sub
    11. Private Sub btnZiehzeitPlus_Click(sender As Object, e As EventArgs) Handles btnZiehzeitPlus.Click
    12. 'Ziehzeit erhöhen
    13. Ziehzeitaendern("+")
    14. End Sub
    15. Private Sub btnZiehzeitMinus_Click(sender As Object, e As EventArgs) Handles btnZiehzeitMinus.Click
    16. 'Ziehzeit verkürzen
    17. Ziehzeitaendern("-")
    18. End Sub
    19. Private Sub btnstart_Click(sender As Object, e As EventArgs) Handles btnstart.Click
    20. 'Sub zum starten des Timers
    21. 'Ziehzeit in Sekunden umrechnen
    22. Dim ZiehSekunden As Integer = Integer.Parse(lblZiehzeitSekunden.Text)
    23. Dim ZiehMinuten As Integer = Integer.Parse(lblZiehzeitMinuten.Text)
    24. Dim Ziehzeit As Integer = ZiehSekunden + ZiehMinuten * 60
    25. 'wenn keine Zeit vergeben wurde, abbruch der Sub
    26. If Ziehzeit = 0 Then
    27. MessageBox.Show("Bitte Ziehzeit eingeben.")
    28. Exit Sub
    29. End If
    30. 'Temperaturzeit in Sekunden umrechnen
    31. Dim AbkuehlSekunden As Integer = Integer.Parse(lblAbkuehlzeitSekunden.Text)
    32. Dim AbkuehlMinuten As Integer = Integer.Parse(lblAbkuehlzeitMinuten.Text)
    33. Dim Abkuehlzeit As Integer = AbkuehlSekunden + AbkuehlMinuten * 60
    34. 'aktuelle Form ausblenden
    35. Me.Hide()
    36. 'Wenn Abkühlzeit größer als 0, dann zeigen der Form fTimer Abkühlen
    37. If Abkuehlzeit > 0 Then
    38. Dim frmAbkuehlzeit As New fTimer
    39. With frmAbkuehlzeit
    40. .Zeit = Abkuehlzeit
    41. .Ziehen = False
    42. .ShowDialog(Me)
    43. End With
    44. End If
    45. 'zeigen der Form fTimer für die Ziehzeit
    46. Dim frmZiehzeit As New fTimer
    47. With frmZiehzeit
    48. .Zeit = Ziehzeit
    49. .Ziehen = True
    50. .ShowDialog(Me)
    51. End With
    52. Me.Show()
    53. End Sub
    54. Private Sub btnbeenden_Click(sender As Object, e As EventArgs) Handles btnbeenden.Click
    55. 'Sub zum beenden des Programms
    56. Me.Close()
    57. End Sub
    58. 'Klick Events - MenuStrip1
    59. Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
    60. Me.Close()
    61. End Sub
    62. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
    63. Dim frmEinstellungen As New fProgrammeinstellungen
    64. frmEinstellungen.Show(Me)
    65. End Sub
    66. 'Change Events
    67. Private Sub lblTemperatur_TextChanged(sender As Object, e As EventArgs) Handles lblTemperatur.TextChanged
    68. 'Temperatur aus lblTemperatur auslesen und Abkuehlzeit entsprechend ändern
    69. Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
    70. Select Case Temperatur
    71. Case = 100 : TemperaturinZeit(0)
    72. Case = 95 : TemperaturinZeit(My.Settings.Temp95)
    73. Case 90 : TemperaturinZeit(My.Settings.Temp90)
    74. Case = 85 : TemperaturinZeit(My.Settings.Temp85)
    75. Case = 80 : TemperaturinZeit(My.Settings.Temp80)
    76. Case = 75 : TemperaturinZeit(My.Settings.Temp75)
    77. Case = 70 : TemperaturinZeit(My.Settings.Temp70)
    78. Case = 65 : TemperaturinZeit(My.Settings.Temp65)
    79. Case 60 : TemperaturinZeit(My.Settings.Temp60)
    80. End Select
    81. End Sub
    82. 'Subs und Funktionen
    83. Private Sub Temperaturaendern(Faktor As Integer)
    84. 'Sub zum ändern der Temperatur
    85. Dim Temperatur As Integer = Integer.Parse(lblTemperatur.Text)
    86. Temperatur = Temperatur + Faktor
    87. If Temperatur > 100 OrElse Temperatur < 60 Then Exit Sub
    88. lblTemperatur.Text = Temperatur.ToString
    89. End Sub
    90. Private Sub Ziehzeitaendern(op As String)
    91. 'Intervall aus den Einstellungen lesen
    92. Dim Intervall As Decimal = My.Settings.Zeitintervall
    93. Dim Sekunden As Decimal = Integer.Parse(lblZiehzeitSekunden.Text)
    94. Dim Minuten As Integer = Integer.Parse(lblZiehzeitMinuten.Text)
    95. If op = "+" Then
    96. 'Sekunden erhöhen
    97. Sekunden = Sekunden + Intervall
    98. 'wenn Sekunden >= 60, dann Sekunden -60 und Minuten +1
    99. If Sekunden >= 60 Then
    100. Sekunden = Sekunden - 60
    101. Minuten = Minuten + 1
    102. End If
    103. Else
    104. 'Sekunden verringern
    105. 'Abbruch, wenn Minuten und Sekunden auf 0 stehen
    106. If Minuten = 0 AndAlso Sekunden = 0 Then Exit Sub
    107. Sekunden = Sekunden - Intervall
    108. 'wenn Sekunden < 0, dann Sekunden +60 und Minuten -1
    109. If Sekunden < 0 Then
    110. Sekunden = Sekunden + 60
    111. Minuten = Minuten - 1
    112. End If
    113. End If
    114. 'Minuten und Sekunden ggf mit voranstehender 0 in Labels schreiben
    115. If Minuten < 10 Then
    116. lblZiehzeitMinuten.Text = "0" & Minuten.ToString
    117. Else
    118. lblZiehzeitMinuten.Text = Minuten.ToString
    119. End If
    120. If Sekunden < 10 Then
    121. lblZiehzeitSekunden.Text = "0" & Sekunden.ToString
    122. Else
    123. lblZiehzeitSekunden.Text = Sekunden.ToString
    124. End If
    125. End Sub
    126. Private Sub TemperaturinZeit(Zeit As Integer)
    127. 'Sub zum ändern der Abkühlzeit je nach Temperatur
    128. If Zeit >= 60 Then
    129. 'Umwandeln der Sekunden in Minuten und Sekunden
    130. lblAbkuehlzeitMinuten.Text = (Zeit \ 60).ToString
    131. lblAbkuehlzeitSekunden.Text = (Zeit Mod 60).ToString
    132. Else
    133. lblAbkuehlzeitSekunden.Text = Zeit.ToString
    134. End If
    135. End Sub
    136. End Class



    Code der Einstellungenform
    Spoiler anzeigen

    Quellcode

    1. Public Class fProgrammeinstellungen
    2. 'Form Load Event
    3. Private Sub fProgrammeinstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'Laden der Abkühlzeiten aus My.Settings
    5. Abkuehlzeitschreiben(My.Settings.Temp95, Nud95Min, Nud95Sek)
    6. Abkuehlzeitschreiben(My.Settings.Temp90, Nud90Min, Nud90Sek)
    7. Abkuehlzeitschreiben(My.Settings.Temp85, Nud85Min, Nud85Sek)
    8. Abkuehlzeitschreiben(My.Settings.Temp80, Nud80Min, Nud80Sek)
    9. Abkuehlzeitschreiben(My.Settings.Temp75, Nud75Min, Nud75Sek)
    10. Abkuehlzeitschreiben(My.Settings.Temp70, Nud70Min, Nud70Sek)
    11. Abkuehlzeitschreiben(My.Settings.Temp65, Nud65Min, Nud65Sek)
    12. Abkuehlzeitschreiben(My.Settings.Temp60, Nud60Min, Nud60Sek)
    13. End Sub
    14. 'Klick Events Buttons
    15. Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
    16. 'Speichern in My.Settings
    17. 'Abkuehlzeiten nur speichern, wenn globale boolean True
    18. My.Settings.Temp95 = Integer.Parse(Nud95Min.Text) * 60 + Integer.Parse(Nud95Sek.Text)
    19. My.Settings.Temp90 = Integer.Parse(Nud90Min.Text) * 60 + Integer.Parse(Nud90Sek.Text)
    20. My.Settings.Temp85 = Integer.Parse(Nud85Min.Text) * 60 + Integer.Parse(Nud85Sek.Text)
    21. My.Settings.Temp80 = Integer.Parse(Nud80Min.Text) * 60 + Integer.Parse(Nud80Sek.Text)
    22. My.Settings.Temp75 = Integer.Parse(Nud75Min.Text) * 60 + Integer.Parse(Nud75Sek.Text)
    23. My.Settings.Temp70 = Integer.Parse(Nud70Min.Text) * 60 + Integer.Parse(Nud70Sek.Text)
    24. My.Settings.Temp65 = Integer.Parse(Nud65Min.Text) * 60 + Integer.Parse(Nud65Sek.Text)
    25. My.Settings.Temp60 = Integer.Parse(Nud60Min.Text) * 60 + Integer.Parse(Nud60Sek.Text)
    26. Me.Close()
    27. End Sub
    28. 'Subs und Funktionen
    29. Private Sub Abkuehlzeitschreiben(Temp As Integer, NudMin As NumericUpDown, NudSek As NumericUpDown)
    30. If Temp >= 60 Then
    31. NudMin.Text = (Temp \ 60).ToString
    32. NudSek.Text = (Temp Mod 60).ToString
    33. Else
    34. NudSek.Text = Temp.ToString
    35. NudMin.Text = "0"
    36. End If
    37. End Sub
    38. End Class


    @RodFromGermany:

    Quellcode

    1. Module Module1
    2. Sub Main()
    3. ' Use the TimeSpan constructor to specify...
    4. ' ... days, hours, minutes, seconds, milliseconds.
    5. Dim span As TimeSpan = New TimeSpan(1, 2, 0, 30, 0)
    6. Console.WriteLine(span)
    7. End Sub
    8. End Module

    Das scheint ja viel mehr Sinn zu machen, als mein Ansatz mit zwei Boxen pro Temperatur ...
    Aber zum rechnen mit den Inhalten von Textboxen (oder mittlerweile Nuds):
    Ist es immer strikt zu trennen? Also ich könnte ja in der Sub Variablen mit den Inhalten belegen und dann damit rechnen, aber es das nicht bei meiner Pupsrechnung hier egal?
    Bilder
    • Hauptform.jpg

      256,61 kB, 2.520×1.180, 62 mal angesehen
    • Einstellungen.jpg

      307,68 kB, 2.536×1.294, 57 mal angesehen

    DerSmurf schrieb:

    aber es das nicht bei meiner Pupsrechnung hier egal?
    Beim nächsten Mal fängst Du wieder so an. Da ist es doch besser, Du machst es gleich richtig.
    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!