Visual Basic Calculator (Winform)

  • VB.NET

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

    Visual Basic Calculator (Winform)

    Ich habe einen Taschenrechner mit Visual Basic programmiert, möchte aber noch ein paar Funktionen hinzufügen. Aber ich kann nicht herausfinden, wie ich die folgenden Probleme in meinem Code lösen kann:

    Wenn mehr als eine Null in das Eingabefeld eingegeben wird, sollte es einfach die führenden Nullen löschen (Beispiel 0000111 -----> 111 oder 0002345 ----> 2345).

    Ebenso sollte eine Dezimalzahl nicht mehrere Nullen vor dem Komma haben (Beispiel 000,176 ----> 0,176)

    außerdem sollte es nicht möglich sein, zwei Kommas einzugeben (Beispiel 0.187.56 -----> sollte nicht möglich sein -----------------> 0.18756)

    Könnte mir jemand helfen?

    ```

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public LCD As Single
    3. Public OPZ As String
    4. Private Sub LCDfuellen(sender As Object, e As EventArgs) Handles btn3.Click, btn2.Click, btn1.Click, btn9.Click, btn8.Click, btn7.Click, btn6.Click, btn5.Click, btn4.Click
    5. txtLCD.Text &= ActiveControl.Tag
    6. Replace(LTrim(Replace(txtLCD.Text, "0", " ")), " ", "0")
    7. End Sub
    8. Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    9. txtLCD.Clear()
    10. End Sub
    11. Private Sub btnCE_Click(sender As Object, e As EventArgs) Handles btnCE.Click
    12. 'txtLCD.Text = txtLCD.Text.Remove(txtLCD.TextLength - 1, 1)
    13. txtLCD.Text = LSet(txtLCD.Text, txtLCD.TextLength - 1)
    14. End Sub
    15. Private Sub OPZlesen(sender As Object, e As EventArgs) Handles btnPlus.Click, btnMinus.Click, btnMal.Click, btnDurch.Click
    16. LCD = CSng(txtLCD.Text)
    17. txtLCD.Clear()
    18. OPZ = ActiveControl.Tag
    19. End Sub
    20. Private Sub btnGleich_Click(sender As Object, e As EventArgs) Handles btnGleich.Click
    21. Dim activeLCD As Single
    22. activeLCD = CSng(txtLCD.Text)
    23. Select Case OPZ
    24. Case "+" : txtLCD.Text = CStr(LCD + activeLCD)
    25. Case "-" : txtLCD.Text = CStr(LCD - activeLCD)
    26. Case "*" : txtLCD.Text = CStr(LCD * activeLCD)
    27. Case "/" : txtLCD.Text = CStr(LCD / activeLCD)
    28. End Select
    29. End Sub
    30. Private Sub btn0_Click(sender As Object, e As EventArgs) Handles btn0.Click
    31. txtLCD.Text &= ActiveControl.Tag
    32. End Sub
    33. Private Sub btnPunkt_Click(sender As Object, e As EventArgs) Handles btnPunkt.Click
    34. txtLCD.Text &= ActiveControl.Tag
    35. End Sub
    36. End Class

    ```

    von WPF nach sonstiges verschoben, da es nix mit WPF zu tun hat; Label geändert, da es nix mit Modern UI zu tun hat; CodeTags gesetzt ~VaporiZed
    Dateien
    • RechnerInf18.zip

      (64,43 kB, 3 mal heruntergeladen, zuletzt: )

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

    Willkommen im Forum.

    Der Code ist noch etwas fehleranfällig. z.B.: Starte das Programm und klick auf [<--]. Die Folge: Absturz
    Die Subs LCDfuellen, btn0_Click, btnPunkt_Click machen das Gleiche - zumindest im hochgeladenen Projekt
    Das doppelte Komma könntest Du erstmal so lösen, indem Du prüfst, ob schon ein Komma da ist: If txtLCD.Text.Contains(",") Then ...
    Führende Nullen kannst Du aufspüren mit: If txtLCD.Text.StartsWith("0") Then ...
    Im gleichen Atemzug musst Du aber schauen, ob das Zeichen nach einer führenden Null ein Komma oder eine Zahl ist: If txtLCD.Text.Substring(Startindex, 1) = ...; Startindex ist eine 0-basierte Position, ab der der Text ausgewertet werden soll. Hast Du also txtLCD.Text.Substring(0, 1), bekommst Du ein Zeichen ab der 1. Textposition, also das erste Zeichen des Texts. txtLCD.Text.Substring(0, 10) ergibt die ersten 10 Zeichen, txtLCD.Text.Substring(1, 1) ergibt das 2. Zeichen, ...

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    Wenn Du ein Projekt hochlädst, dann bitte bereinigt (außerdem ohne bin-, obj-, .vs- und .git-Ordner)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @firebro Willkommen im Forum. :thumbup:
    Ist ja recht heftig, Dein Start hier.
    Also:
    Trenne Daten und GUI.
    So was:

    VB.NET-Quellcode

    1. txtLCD.Text = CStr(LCD + activeLCD)
    ist kontraproduktiv.
    Arbeite mit numerischen Werten und zeige Strings an der GUI an.
    Verwende einen Double-Wert, für LCD, weil alle höheren Mathematik-Operationen den zurückgeben (Sin, Cos, Exp, ...).
    Konvertiere den Eingabestring in einen Double-Wert: Double.TryParse(...), da knallt nix.
    Führe die Operation durch und zeige dann das Ergebnis an.
    Wenn Du nicht willst, dass 2 Kommas eingegeben werden können sollen, musst Du etwas weiter in die Trickkiste greifen, da kannst Du auch gleich unterdrücken, dass "Roullade mit Klößen" eingegeben werden kann. ( :thumbsup: )
    Da wäre es tatsächlich das Beste, Du machst Dir ein UserControl basierend auf TextBox, das die entsprechenden Eigenschaften hat.
    Allerdings glaube ich, dass Du im Moment noch nicht so weit bist.
    Also arbeite mit Double.TryParse(...) und gib im Fehlerfdall einen entsprechenden Fehlertext aus.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!