Variablen bzw. Labels addieren

  • VB.NET

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

    Variablen bzw. Labels addieren

    Hallo, ich programmiere gerade eine sehr kleine Kasse. Soweit klappt alles, nur habe ich das Problem, dass in meiner Labelanzeige "Geld in der Kasse" das Geld nach dem Kauf nicht addiert wird, bzw. immer nur 1 Mal. Sobald ich auf Button 2 (ware2) drücke addiert das Programm diesen Wert zum Ausgangswert, wenn ich also am Anfang 10 € habe und das Programm 1 € dazu rechnen soll funktioniert das auch. Drücke ich auf die gleiche Taste nochmal, also nochmal 1 € dazu macht er das nicht, er bleibt bei 11 . Drücke ich jetzt Taste 2 mit 2,50 € Steht in Label 9 12,50. (usw. mit Taste 3/4)

    Könnt ihr mir helfen? Im Anhang noch ein Bild vom Aufbau des Programms.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lines() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Waren.txt")
    3. Dim preis() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Preise.txt")
    4. Dim menge() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Menge.txt")
    5. Dim geldinkasse As String = Form2.TextBox1.Text
    6. Dim zahl1 As Decimal
    7. Dim zahl2 As Decimal
    8. Dim zahl3 As Decimal
    9. Dim zahl4 As Decimal
    10. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. Label9.Text = geldinkasse
    12. ware1.Text = lines(0)
    13. ware2.Text = lines(1)
    14. ware3.Text = lines(2)
    15. ware4.Text = lines(3)
    16. Label1.Text = preis(0) + " €"
    17. Label2.Text = preis(1) + " €"
    18. Label3.Text = preis(2) + " €"
    19. Label4.Text = preis(3) + " €"
    20. Label5.Text = menge(0)
    21. Label6.Text = menge(1)
    22. Label7.Text = menge(2)
    23. Label8.Text = menge(3)
    24. zahl1 = preis(0)
    25. zahl2 = preis(1)
    26. zahl3 = preis(2)
    27. zahl4 = preis(3)
    28. End Sub
    29. Private Sub ware1_Click(sender As Object, e As EventArgs) Handles ware1.Click
    30. Label5.Text = Label5.Text - "1"
    31. Label9.Text = geldinkasse + zahl1
    32. If Label5.Text = "0" Then
    33. MsgBox("Kein(e) " + ware1.Text + " mehr da")
    34. ware1.Enabled = False
    35. End If
    36. End Sub
    37. Private Sub ware2_Click(sender As Object, e As EventArgs) Handles ware2.Click
    38. Label6.Text = Label6.Text - "1"
    39. Label9.Text = geldinkasse + zahl2
    40. If Label6.Text = "0" Then
    41. MsgBox("Kein(e) " + ware2.Text + " mehr da")
    42. ware2.Enabled = False
    43. End If
    44. End Sub
    45. Private Sub ware3_Click(sender As Object, e As EventArgs) Handles ware3.Click
    46. Label7.Text = Label7.Text - "1"
    47. Label9.Text = geldinkasse + zahl3
    48. If Label7.Text = "0" Then
    49. MsgBox("Kein(e) " + ware3.Text + " mehr da")
    50. ware3.Enabled = False
    51. End If
    52. End Sub
    53. Private Sub ware4_Click(sender As Object, e As EventArgs) Handles ware4.Click
    54. Label8.Text = Label8.Text - "1"
    55. Label9.Text = geldinkasse + zahl4
    56. If Label8.Text = "0" Then
    57. MsgBox("Kein(e) " + ware4.Text + " mehr da")
    58. ware4.Enabled = False
    59. End If
    60. End Sub
    61. End Class
    Bilder
    • Unbenannt-1.jpg

      35,67 kB, 632×476, 133 mal angesehen
    Mach mal "OPTION STRICT ON" und behebe dann alle Fehler. Bzw. Les dir vorher was dazu durch.
    Du schreibst "Label1.Text - 1" Wie willst du denn "Text" (String) - Zahl (Integer) rechnen ?! Das geht mathematisch nicht.
    Ich persönlich würde nur mit Variablen rechnen und dann den Text gleich der Variablen setzten.
    Mit OPTION STRICT ON sieht das ganze jetzt so aus.
    Kannst du mir noch erklären, wie du das mit "nur mit Variablen rechen" meinst? Also wie kann ich die Label zu Variablen machen? Ich hatte das schon ein bisschen versucht, es hat aber nicht funtioniert :(

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lines() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Waren.txt")
    3. Dim preis() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Preise.txt")
    4. Dim menge() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Menge.txt")
    5. Dim geldinkasse As Decimal = CDec(Form2.TextBox1.Text)
    6. Dim zahl1 As Decimal
    7. Dim zahl2 As Decimal
    8. Dim zahl3 As Decimal
    9. Dim zahl4 As Decimal
    10. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. Label9.Text = CStr(geldinkasse)
    12. ware1.Text = lines(0)
    13. ware2.Text = lines(1)
    14. ware3.Text = lines(2)
    15. ware4.Text = lines(3)
    16. Label1.Text = preis(0) + " €"
    17. Label2.Text = preis(1) + " €"
    18. Label3.Text = preis(2) + " €"
    19. Label4.Text = preis(3) + " €"
    20. Label5.Text = menge(0)
    21. Label6.Text = menge(1)
    22. Label7.Text = menge(2)
    23. Label8.Text = menge(3)
    24. zahl1 = CDec(preis(0))
    25. zahl2 = CDec(preis(1))
    26. zahl3 = CDec(preis(2))
    27. zahl4 = CDec(preis(3))
    28. End Sub
    29. Private Sub ware1_Click(sender As Object, e As EventArgs) Handles ware1.Click
    30. Label5.Text = CStr(CDbl(Label5.Text) - Val("1"))
    31. Label9.Text = CStr(geldinkasse + zahl1)
    32. If Label5.Text = "0" Then
    33. MsgBox("Kein(e) " + ware1.Text + " mehr da")
    34. ware1.Enabled = False
    35. End If
    36. End Sub
    37. Private Sub ware2_Click(sender As Object, e As EventArgs) Handles ware2.Click
    38. Label6.Text = CStr(CDbl(Label6.Text) - Val("1"))
    39. Label9.Text = CStr(geldinkasse + zahl2)
    40. If Label6.Text = "0" Then
    41. MsgBox("Kein(e) " + ware2.Text + " mehr da")
    42. ware2.Enabled = False
    43. End If
    44. End Sub
    45. Private Sub ware3_Click(sender As Object, e As EventArgs) Handles ware3.Click
    46. Label7.Text = CStr(CDbl(Label7.Text) - Val("1"))
    47. Label9.Text = CStr(geldinkasse + zahl3)
    48. If Label7.Text = "0" Then
    49. MsgBox("Kein(e) " + ware3.Text + " mehr da")
    50. ware3.Enabled = False
    51. End If
    52. End Sub
    53. Private Sub ware4_Click(sender As Object, e As EventArgs) Handles ware4.Click
    54. Label8.Text = CStr(CDbl(Label8.Text) - Val("1"))
    55. Label9.Text = CStr(geldinkasse + zahl4)
    56. If Label8.Text = "0" Then
    57. MsgBox("Kein(e) " + ware4.Text + " mehr da")
    58. ware4.Enabled = False
    59. End If
    60. End Sub
    61. End Class
    Beschreib mal verbal, was beim Klicken auf welchen Button passieren soll.
    "Labels addieren" - Was soll bei Label1 plus Label2 rauskommen?
    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!
    Nein. Du solltest eine Variable von Typ Integer oder Double (wenn du Nachkommastellen brauchst) erstellen und in dieser dann den Preis speichern. Dann rechnest du mit der Variable und erstellst aus ihr jedes mal den String neu, der dann im Label angezeigt wird.
    So ein Projekt ist perfekt zum Üben. Deshalb sollte man es auch unbedingt perfekt machen. Du Sagst am Anfang:
    Preis() as String, aber Preise sind doch keine Strings. Das selbe mit Anzahl.
    Dann sagst du: Label1.Text = variable + "€" "+" ist aber ein Rechenoperator. Nutze "&" zum verknüpfen.
    Mit Variablen rechnen meine ich das hier:

    VB.NET-Quellcode

    1. Label5.Text = CStr(CDbl(Label5.Text) - Val("1")
    Da vergewaltigst du zuerst den Text zu einer Zahl, rechnest, und dann wieder zu einem Text
    Nehm statt "Label1.Text" eine Variable.

    VB.NET-Quellcode

    1. Dim summe1 as Double = 10.00
    2. Sub blbla_click() Handles blbla.Click()
    3. summe1 = summe1 + 1.00
    4. Label1.Text = summe1.ToString
    5. End Sub
    @LaMiy: Das geht in die richtige Richtung. ;)
    @Breakfruit: Trenne Daten und GUI. Gerechnet wird mit Zahlen und numerischen Variablen. Wenns um Geld geht: Double oder Decimal, wegen er Nachkommastellen.
    Also: Alle numerischen Texteingaben werden in numerische Werte konvertiert: Double.TryParse(...), Decimal.TryParse(...).
    Überleg was passieren könnte, wenn jemand "Vanilliepudding mit Blaubeersoße" eingibt statt "8,50".
    Wenn Du damit Schwierigkeiten hast, nimm ein NumericUpDown-Control, da können nur numerische Werte eingegeben werden.
    Wenn dann alle Werte als Zahlen vorliegen, kannst Dzu damit rechnen.
    Und wenn alles zusammengerechnet wurde, wird das Ergebnis mit ToString ausgegeben.
    Und wenn Du monetäre Werte ausgeben willst, wird der String entsprechend formatiert:

    VB.NET-Quellcode

    1. Dim value As Decimal = 6
    2. MessageBox.Show(value.ToString("c"))
    Feddich.
    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!
    So klappt's jetzt :)

    Danke für eure Hilfe! Ich bau das Programm jetzt mal weiter aus... :D

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lines() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Waren.txt")
    3. Dim preis() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Preise.txt")
    4. Dim menge() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\files\Menge.txt")
    5. Dim geldinkasse As Decimal = CDec(Form2.TextBox1.Text)
    6. Dim zahl1 As Decimal
    7. Dim zahl2 As Decimal
    8. Dim zahl3 As Decimal
    9. Dim zahl4 As Decimal
    10. Dim summe1 As Double = geldinkasse
    11. Dim verkauft As Decimal = 1
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. Label9.Text = CStr(geldinkasse)
    14. ware1.Text = lines(0)
    15. ware2.Text = lines(1)
    16. ware3.Text = lines(2)
    17. ware4.Text = lines(3)
    18. Label1.Text = preis(0) & " €"
    19. Label2.Text = preis(1) & " €"
    20. Label3.Text = preis(2) & " €"
    21. Label4.Text = preis(3) & " €"
    22. Label5.Text = menge(0)
    23. Label6.Text = menge(1)
    24. Label7.Text = menge(2)
    25. Label8.Text = menge(3)
    26. zahl1 = CDec(preis(0))
    27. zahl2 = CDec(preis(1))
    28. zahl3 = CDec(preis(2))
    29. zahl4 = CDec(preis(3))
    30. End Sub
    31. Private Sub ware1_Click(sender As Object, e As EventArgs) Handles ware1.Click
    32. summe1 = summe1 + zahl1
    33. Label5.Text = CStr(CDbl(Label5.Text) - verkauft)
    34. Label9.Text = summe1.ToString
    35. If Label5.Text = "0" Then
    36. MsgBox("Kein(e) " + ware1.Text + " mehr da")
    37. ware1.Enabled = False
    38. End If
    39. End Sub
    40. Private Sub ware2_Click(sender As Object, e As EventArgs) Handles ware2.Click
    41. summe1 = summe1 + zahl2
    42. Label6.Text = CStr(CDbl(Label6.Text) - verkauft)
    43. Label9.Text = summe1.ToString
    44. If Label6.Text = "0" Then
    45. MsgBox("Kein(e) " + ware2.Text + " mehr da")
    46. ware2.Enabled = False
    47. End If
    48. End Sub
    49. Private Sub ware3_Click(sender As Object, e As EventArgs) Handles ware3.Click
    50. summe1 = summe1 + zahl3
    51. Label7.Text = CStr(CDbl(Label7.Text) - verkauft)
    52. Label9.Text = summe1.ToString
    53. If Label7.Text = "0" Then
    54. MsgBox("Kein(e) " + ware3.Text + " mehr da")
    55. ware3.Enabled = False
    56. End If
    57. End Sub
    58. Private Sub ware4_Click(sender As Object, e As EventArgs) Handles ware4.Click
    59. summe1 = summe1 + zahl4
    60. Label8.Text = CStr(CDbl(Label8.Text) - verkauft)
    61. Label9.Text = summe1.ToString
    62. If Label8.Text = "0" Then
    63. MsgBox("Kein(e) " + ware4.Text + " mehr da")
    64. ware4.Enabled = False
    65. End If
    66. End Sub
    67. End Class

    Breakfruit schrieb:

    VB.NET-Quellcode

    1. Dim geldinkasse As Decimal = CDec(Form2.TextBox1.Text)
    Da hast Du aber aufgrund des scheiß VB6-Kompatibilitätsmodus Glück, dass Die diese Zeile nicht um die Ohren fliegt.
    In dem Moment, wo diese Zeile abgearbeitet wird, gibt es noch keine (richtige mit New erstellte) Instanz von Form2, also würde es knallen wegen NULL-Pointer-Zugriff.
    Informiere Dich mal über modale und nicht modale Dialoge.
    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!