Problem beim Abfangen von Fehlerhaften eingaben einer Textbox

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von AirFlow_.

    Problem beim Abfangen von Fehlerhaften eingaben einer Textbox

    Ich habe eine Textbox, in die nur Werte von 1 bis 64 eingegeben werden dürfen, alle anderen Eingaben sollen abgefangen werden, was auch soweit klappt.

    Nurdie Zahlen 7, 8 und 9 werden komischerweiße auch als Fehlerhafte Eingabe Abgefangen.

    Villeicht kann mir hier ja wer meinen Fehler sagen.

    Danke Schonmal im vorraus.

    Mfg

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Feld, Zähler As Byte
    3. Dim Zahl_Reiskörner, Zahl_Reiskörner_Gesamt, Berechnung_Reiskörner_Gesamt As Double
    4. Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
    5. Ausgabe_Feld.Text = "Feld:"
    6. Ausgabe_Reiskörner.Text = "Reiskörner:"
    7. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt:"
    8. Zahl_Reiskörner_Gesamt = 0
    9. Select Case EingabeZahl.Text
    10. Case ""
    11. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    12. Case Is < 1
    13. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    14. Case Is > 64
    15. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    16. Case Else
    17. Feld = EingabeZahl.Text
    18. Ausgabe_Feld.Text = "Feld: " & Feld
    19. Zahl_Reiskörner = 2 ^ (Feld - 1)
    20. Ausgabe_Reiskörner.Text = "Reiskörner: " & Zahl_Reiskörner
    21. Zähler = 1
    22. For Test = Zähler To Feld
    23. Berechnung_Reiskörner_Gesamt = 2 ^ (Zähler - 1)
    24. Zahl_Reiskörner_Gesamt = Zahl_Reiskörner_Gesamt + Berechnung_Reiskörner_Gesamt
    25. Zähler = Zähler + 1
    26. Next
    27. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt: " & Zahl_Reiskörner_Gesamt
    28. End Select
    29. End Sub
    30. End Class
    danke für die schnelle antwort, werd direkt mal versuchen es umzusetzen. lg

    so, musste en bishen rumteste, aber dein beitrag war sehr hilfreich sieht nun bei mi folgender maßen aus :


    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Feld, Zähler As Byte
    4. Dim Zahl_Reiskörner, Zahl_Reiskörner_Gesamt, Berechnung_Reiskörner_Gesamt As Double
    5. Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
    6. Ausgabe_Feld.Text = "Feld:"
    7. Ausgabe_Reiskörner.Text = "Reiskörner:"
    8. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt:"
    9. Zahl_Reiskörner_Gesamt = 0
    10. Select Case EingabeZahl.Text
    11. Case ""
    12. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    13. Case Else
    14. Select Case CDbl(EingabeZahl.Text)
    15. Case Is < 1
    16. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    17. Case Is > 64
    18. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    19. Case Else
    20. Feld = CByte(EingabeZahl.Text)
    21. Ausgabe_Feld.Text = "Feld: " & Feld
    22. Zahl_Reiskörner = 2 ^ (Feld - 1)
    23. Ausgabe_Reiskörner.Text = "Reiskörner: " & Zahl_Reiskörner
    24. Zähler = 1
    25. For Test = Zähler To Feld
    26. Berechnung_Reiskörner_Gesamt = 2 ^ (Zähler - 1)
    27. Zahl_Reiskörner_Gesamt = Zahl_Reiskörner_Gesamt + Berechnung_Reiskörner_Gesamt
    28. Zähler = CByte(Zähler + 1)
    29. Next
    30. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt: " & Zahl_Reiskörner_Gesamt
    31. End Select
    32. End Select
    33. End Sub
    34. End Class

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

    @xagels: Und? Funktioniert es jetzt?
    Nebenbei: Informiere Dich richtig über Datentypen: Lies ein Buch
    Bei `Select Case CDbl(EingabeZahl.Text)` konvertierst Du den eingegebenen Text zu einem Double-Wert. Was aber, wenn der Benutzer "Schokotorte" eingibt? Das kann nicht nach Double konvertiert werden.
    Nebenbei ist ein Double eine Zahl mit Dezimalstellen. Weiter unten konvertierst Du die Eingabe aber mit `CByte(EingabeZahl.Text)` zu Byte, was eine 8Bit Ganzzahl ohne Vorzeichen (0 bis 255) ist.
    Siehe Dir Integer.TryParse() an.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    Immernoch alles andere als gut:
    In Zeile 15 castest du zu Double, in Zeile 21 zu Byte?! Ich würde Integer nehmen, denn Double ist eine Kommazahl. Byte sollte funktionieren, aber in anderen Fällen kannst du damit Probleme bekommen weil der Wertebereich einfach so klein ist.

    Warum benutzt du kein NummericUpDown?

    VB.NET-Quellcode

    1. 'das kannst du alles im Designer machen:
    2. NumericUpDown1.Maximum = 64
    3. NumericUpDown1.Minimum = 1
    4. NumericUpDown1.DecimalPlaces = 0 'du willst ja keine Kommastellen haben
    5. Sub berechneIrgendwas()
    6. Dim value As Integer = CInt(NumericUpDown1.Value) 'und der wert ist IMMER zwischen 1 und 64
    7. 'berechne was du willst
    8. End Sub


    Wenn der Wert von NumUpDown1 häufiger benötigt wird (also in anderen Methoden) empfiehlt es sich eine Variable außerhalb der Methoden anzulegen und diese im NummericUpDown1-.ValueChanged-Event zu aktualisieren. So rechnest du immer mit dem passenden Wert und muss nur an einer einzigen Stelle casten.

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

    Wenn du bei der Textbox bleiben willst, kannst du auch nur Zahleneingaben zulassen:
    Das muss dann ins KeyDown Event

    VB.NET-Quellcode

    1. Select Case e.Keycode
    2. Case Keys.D0 To Keys.D9, Keys.Space, Keys.Back
    3. 'nur Zahlen rausfiltern (Leertaste und löschen geht auch)
    4. Case else
    5. e.SuppresskeyPress = true
    6. 'alles andere blockieren lassen
    @xagels: Kannst Du mir sagen, wo die Schule ist? Dann komme ich persönlich vorbei und erwürge den Lehrer.
    Es hat keinen Sinn, euch irgend ein Frickelwerk beizubringen, mit dem ihr in der Praxis nur Probleme haben werdet.
    Und noch was: Der Lehrer hat kein einziges Wort über Option Strict On gesagt? Zeige ihm bitte diesen Link: erfinderdesrades.unitweb.de/Pr…/Blogs/WarumStrictOn.html
    Beim Programmieren ist die Kenntnis der Typen absolute Grundlage.
    VB wird in der Berufswelt nur noch selten eingesetzt. Viel öfters kommt C# vor, das ebenfalls auf dem .Net Framework aufsetzt. Ziel des Unterrichts sollte es eigentlich sein, euch auf die Arbeitswelt vorzubereiten. Programmieren lernen geht mit Basic einfach, weil es eine einfach zu verstehende Sprache ist. Leider hat sie manchmal ihre Tücken (z.B. Option Strict Off oder Standardistanzen bei Forms). Wenn ihr das vom Lehrer falsch erklärt bekommt, dann könnt ihr nachher genausowenig programmieren wie vorher. Was aber hängenbleibt ist der Glaube daran, dass das bei anderen Programmiersprachen auch so ist, dass man zwischen Datentypen wild konvertieren kann (bei PHP ist das so, aber über dem Niveau dieser Sprache sind noch Kellerwohnungen frei).
    Also entweder soll es euch der Lehrer richtig beibringen, oder garnicht.

    Also um das Ganze mit einer TextBox zu realisieren, solltest Du Dir Integer.TryParse() anschauen. Auch mal danach googeln, oder im Visual Studio den Cursor drauf setzen und F1 drücken, oder im ObjectBrowser (unter dem Menü "Ansicht" zu finden) danach suchen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    xagels schrieb:

    sonst passt es dem Lehrer nicht.
    Was hattet Ihr denn bis jetzt?
    Und:

    xagels schrieb:

    Dim Feld, Zähler As Byte
    Mach da Integer draus, Byte ist da wirklich nicht für geeignet.
    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!
    es funktioniert soweit, leider tut es kaufmännisch runden, damit die zahlen nicht kaufmännisch gerundet angezeigt werden ( z.B. 3E+18) hab ich nun ein .ToString verwendet, weiß einer villeicht wie man das runden bei großen zahlen generell unterdrücken kann?

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Feld, Zähler As Integer
    4. Dim Zahl_Reiskörner, Zahl_Reiskörner_Gesamt, Berechnung_Reiskörner_Gesamt As Double
    5. Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
    6. Ausgabe_Feld.Text = "Feld:"
    7. Ausgabe_Reiskörner.Text = "Reiskörner:"
    8. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt:"
    9. Zahl_Reiskörner_Gesamt = 0
    10. If Not IsNumeric(EingabeZahl.Text) Then
    11. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 an!", 0, "Fehler!")
    12. Else
    13. Select Case CDbl(EingabeZahl.Text)
    14. Case Is < 1
    15. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    16. Case Is > 64
    17. MsgBox("Bitte geben Sie eine Zahl zwischen 1 und 64 ein!", 0, "Fehler!")
    18. Case Else
    19. Feld = CInt(EingabeZahl.Text)
    20. Ausgabe_Feld.Text = "Feld: " & Feld
    21. Zahl_Reiskörner = 2 ^ (Feld - 1)
    22. Ausgabe_Reiskörner.Text = "Reiskörner: " & Zahl_Reiskörner.ToString("0")
    23. Zähler = 1
    24. For Berechnung_Reiskörner_Gesamtanzahl = Zähler To Feld
    25. Berechnung_Reiskörner_Gesamt = 2 ^ (Zähler - 1)
    26. Zahl_Reiskörner_Gesamt = Zahl_Reiskörner_Gesamt + Berechnung_Reiskörner_Gesamt
    27. Zähler = CInt(Zähler + 1)
    28. Next
    29. Ausgabe_Reiskörner_Gesamt.Text = "Reiskörner gesamt: " & Zahl_Reiskörner_Gesamt.ToString("0")
    30. End Select
    31. End If
    32. End Sub
    33. End Class

    xagels schrieb:

    leider tut es kaufmännisch runden
    Sieh Dir mal Math.Round() 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!
    Dann mach .ToString(x). Sieh mal in der Hilfe nach, was da alles für das x stehen kann.
    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!

    xagels schrieb:

    bekomme da nur laufzeitfehler mit hin.
    Welchen?
    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!

    xagels schrieb:

    NumericUpDown hatten wir noch nicht, und wir dürfen nur sachen verwenden die wir bereits durchgenommen haben, sonst passt es dem Lehrer nicht.
    Von sowas krieg ich Kopfweh. X(

    Das verstößt gegen das grundlegendste Prinzip der Programmierung überhaupt: Nämlich einfach dass man immer die beste Lösung nimmt.

    Also euer Lehrer bringt euch das Gegenteil von Programmieren bei.
    ich habs nun einfach mit if is not isnumeric gelöst das problem mit dem abfangen auch wenn wir das noch nicht hatten, hätte aber noch ne kleine frage:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. MsgBox("test", 4, "Fehler!")
    4. If MsgBoxResult.Yes = 6 Then
    5. Form2.Show()
    6. Me.Hide()
    7. End If
    8. End Sub
    9. End Class


    wenn ich den button drücke kommt nun ne message box mit ja oder nein, wenn ich ja drücke kommt die form2 und form 1 wird versteckt, wie bekomm ich es nun hin, das wenn ich bei form2 auf das x drücke form 1 wieder angezeigt wird?