Frage zum Taschenrechner auf einer anderen Art

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Frage zum Taschenrechner auf einer anderen Art

    Hallo,

    ich bin VB.NET Anfänger und habe in meinem Buch gerade die Variablen, Konstanten, Schleifen und Datentypen kennengelernt und wollte mal einen Taschenrechner machen mit CheckBoxen die das Rechenzeichen enthalten.

    Jetzt nun folgendes Problem..

    Als ich alles benannt habe zB: Dim x As Integer = CInt (TextBox1.Text)

    und Dim y As Integer = CInt (TextBox2.Text)

    [Im Button1 eingetragen]

    Wollte ich folgendes Probieren was aber falsch war..

    If CheckBox1.Visible = True Then x + y

    CheckBox1 war bei mir ein "+"

    Also wenn man die CheckBox1 anklickt soll er halt die Zahl in TextBox1 und TextBox2 addieren.

    Und mit dem Befehl MessageBox.Show soll halt das Ergebnis darstehen. Aber wie Deklariere ich das nur? Und wie mache ich das richtig.

    Oder ist das doch noch zu schwer für einen Anfänger? Das Buch hat ca. 300 Seiten und ich bin gerad auf der Seite 95. Ist auch ein Einsteigerbuch. Und ich bin noch bei Konsolenanwendungen..aber mit den Kenntnissen sollte man doch sowas schon zustande bringen..?

    :(

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

    .... nein nein nein :)
    Das ganze habe ich damals mit If-Blöcken abgefragt, ungefähr so:

    VB.NET-Quellcode

    1. Dim ergebnis As Integer
    2. If CB1.Checked = True Then
    3. ergebnis = x + y
    4. Else
    5. End If
    6. If CB2.Checked = True Then
    7. ergebnis = x - y
    8. Else
    9. End If
    10. If CB3.Checked = True Then
    11. ergebnis = x * y
    12. Else
    13. End If
    14. If CB4.Checked = True Then
    15. ergebnis = x / y
    16. End If
    17. MsgBox("Das Ergebnis ist " & ergebnis)

    Außerdem solltest du das ganze mit RadioButtons machen. Hier das gleiche Prinzip; aber CB1 bis 4 ist dann halt RB1 bis 4.

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

    Okay ;)

    VB.NET-Quellcode

    1. Dim x As Integer = CInt(TextBox1.Text)
    2. Dim y As Integer = CInt(TextBox2.Text)
    3. Dim ergebnis As Integer
    4. If CheckBox1.Checked = True Then _
    5. ergebnis = x + y
    6. If CheckBox2.Checked = True Then _
    7. ergebnis = x - y
    8. If CheckBox3.Checked = True Then _
    9. ergebnis = CInt(x / y)
    10. If CheckBox4.Checked = True Then _
    11. ergebnis = x * y
    12. MessageBox.Show(CStr(ergebnis))


    Klappt jetzt =)

    n0ise schrieb:

    Okay ;)

    VB.NET-Quellcode

    1. Dim x As Integer = CInt(TextBox1.Text)
    2. Dim y As Integer = CInt(TextBox2.Text)
    3. Dim ergebnis As Integer
    4. If CheckBox1.Checked = True Then _
    5. ergebnis = x + y
    6. If CheckBox2.Checked = True Then _
    7. ergebnis = x - y
    8. If CheckBox3.Checked = True Then _
    9. ergebnis = CInt(x / y)
    10. If CheckBox4.Checked = True Then _
    11. ergebnis = x * y
    12. MessageBox.Show(CStr(ergebnis))


    Klappt jetzt =)



    Man kann die ganzen If-Abfragen auch zusammen fassen.

    VB.NET-Quellcode

    1. Select Case True
    2. Case CheckBox1.Checked
    3. ergebnis = x + y
    4. Case CheckBox2.Checked
    5. ergebnis = x - y
    6. Case CheckBox3.Checked
    7. ergebnis = CInt(x / y)
    8. Case CheckBox4.Checked
    9. ergebnis = x * y
    10. End Select
    Ah stimmt...

    Das hat ich ja auch vom Buch aus gelernt aber wieder vergessen..^^

    Danke

    Aber noch eine kurze Frage:

    Warum kann man TextBoxen zb wie sowas:

    VB.NET-Quellcode

    1. If TextBox1.Text & TextBox2.Text = "" Then MessageBox.Show("Bitte Werte eingeben!")


    Mit & Verketten?

    Und zb :

    VB.NET-Quellcode

    1. If CheckBox1.Checked = True Then _
    2. CheckBox2.Enabled = False & CheckBox3.Visible = False _
    3. & CheckBox4.Visbile = False


    Geht nicht..

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

    In Basic.Net ist der &-Operater ein String-Operator der zwei Strings miteinander verkettet und nicht wie in C-basierenden Sprachen ein And(&& -> AndAlso) darstellt und zwei bool'sche Ausdrücke logisch verknüpft.

    Somit ist deine Feststellung vollkommen richtig. Wenn du mehrere Befehle in einer Zeile haben willst kannst du : verweden. Den _ hast du ja schon kennengelernt. Er ist das Gegenteil vom : ;)
    Ja danke, der : war auch im Buch beschrieben bloß es gibt sooo viele möglichkeiten in VB.NET zu verkürzen und Verbinden da vergisst man schon vieles.^^

    Ok eine letzte Frage hab ich noch.


    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. If TextBox1.Text & TextBox2.Text = "" Then MessageBox.Show("Bitte Werte eingeben!")
    4. Exit Sub
    5. Dim x As Integer = CInt(TextBox1.Text)
    6. Dim y As Integer = CInt(TextBox2.Text)
    7. Dim ergebnis As Integer
    8. If CheckBox1.Checked = True Then _
    9. ergebnis = x + y
    10. If CheckBox2.Checked = True Then _
    11. ergebnis = x - y
    12. If CheckBox3.Checked = True Then _
    13. ergebnis = CInt(x / y)
    14. If CheckBox4.Checked = True Then _
    15. ergebnis = x * y
    16. MessageBox.Show("Das Ergebnis ist: " & ergebnis) ' Ergebnis anzeigen + Text




    Müsste doch richtig sein? Aber jetzt steht unten in der Fehler anzeige: Nicht verwendete Variable x,y und Ergebnis.

    Kann doch garnicht sein?

    Also ich will wenn man nichts eingibt halt die MsgBox haben "Bitte Werte eingeben"

    Aber wenn ich "Exit Sub" weglasse und nix in den TextBoxen eingebe kommt ja die Box aber nach dem Ok klicken ein Laufzeitfehler des Programms weil ja x und y nicht eingegeben wurden.

    Kann man das nicht verhindern? Ich habs auch schon mit einer For,Next Schleife versucht aber ohne Erfolg..

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

    Also ich würde vor der Verarbeitung deklarieren.
    Und ist es gewollt von dir das da jetzt kein End Sub und End Class steht :huh: ?
    Mit freundlichen Grüßen
    hudzi
    Hey,

    in dem Code von oben hast du nicht die select case schleife verwendet..
    Gewöhn dir das am Besten an ! :)
    Wenn der Benutzer 2 Checkboxen aktiviert treten bei dir alle vier Rechnungen auf ..

    Ich weiß nicht, ob du in deinem Buch schon so weit bist, aber es gibt das Control NumericUpDown welches speziell für Zahlen gemacht ist ..
    Alternativ kannst du auch mit der Funktion 'IsNumeric' überprüfen ob das, was in den Textboxen steht eine Zahl ist..
    Anstatt den CheckBoxen könntest du auch RadioButtons nehmen, welche wie Checkboxen sind, nur dass du nur eine von denen auswählen kannst.

    gruß, Trudi
    was am sichersten ist mit TryParse in einen Wert zu konvertieren ;)
    da steht nicht verwendet weil es nicht sicher ist dass sie verwendet werden. Geh doch mal davon aus dass alle NICHT Checked sind ;) und arbeite mal mit ElseIf und Else

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Wenn ich hier Deklariere kommt der Fehler der unten geschreiben wurde..
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim x As Integer = CInt(TextBox1.Text)
    5. Dim y As Integer = CInt(TextBox2.Text)
    6. Dim ergebnis As Integer
    7. Select Case True
    8. Case CheckBox1.Checked
    9. ergebnis = x + y
    10. Case CheckBox2.Checked
    11. ergebnis = x - y
    12. Case CheckBox3.Checked
    13. ergebnis = CInt(x / y)
    14. Case CheckBox4.Checked
    15. ergebnis = x * y
    16. End Select
    17. MessageBox.Show("Das Ergebnis ist: " & ergebnis) ' Ergebnis anzeigen + Text
    18. End Sub
    19. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    20. If CheckBox1.Checked = True Then CheckBox2.Enabled = False
    21. If CheckBox1.Checked = True Then CheckBox3.Enabled = False
    22. If CheckBox1.Checked = True Then CheckBox4.Enabled = False
    23. If CheckBox1.Checked = False Then CheckBox2.Enabled = True
    24. If CheckBox1.Checked = False Then CheckBox3.Enabled = True
    25. If CheckBox1.Checked = False Then CheckBox4.Enabled = True
    26. End Sub
    27. Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
    28. If CheckBox2.Checked = True Then CheckBox1.Enabled = False
    29. If CheckBox2.Checked = True Then CheckBox3.Enabled = False
    30. If CheckBox2.Checked = True Then CheckBox4.Enabled = False
    31. If CheckBox2.Checked = False Then CheckBox1.Enabled = True
    32. If CheckBox2.Checked = False Then CheckBox3.Enabled = True
    33. If CheckBox2.Checked = False Then CheckBox4.Enabled = True
    34. End Sub
    35. Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
    36. If CheckBox3.Checked = True Then CheckBox1.Enabled = False
    37. If CheckBox3.Checked = True Then CheckBox2.Enabled = False
    38. If CheckBox3.Checked = True Then CheckBox4.Enabled = False
    39. If CheckBox3.Checked = False Then CheckBox1.Enabled = True
    40. If CheckBox3.Checked = False Then CheckBox2.Enabled = True
    41. If CheckBox3.Checked = False Then CheckBox4.Enabled = True
    42. End Sub
    43. Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged
    44. If CheckBox4.Checked = True Then CheckBox2.Enabled = False
    45. If CheckBox4.Checked = True Then CheckBox3.Enabled = False
    46. If CheckBox4.Checked = True Then CheckBox1.Enabled = False
    47. If CheckBox4.Checked = False Then CheckBox2.Enabled = True
    48. If CheckBox4.Checked = False Then CheckBox3.Enabled = True
    49. If CheckBox4.Checked = False Then CheckBox1.Enabled = True
    50. End Sub




    So war der Code..

    Aber wenn ich mit Else oder ElseIf arbeite steht immer in der Fehlerleiste "ElseIf" muss eine entsprechende If- oder ElseIf-Anweisung voranstehen."

    ....

    Und wo soll ich denn Deklarieren? In dem Bereich "Public Class Form1" kommt wenn ich das denn ausführe ein Fehler: "Invalid Operations Exceptions"

    :S
    wieso deklarieren? oO

    VB.NET-Quellcode

    1. if blaa = blubb then blooooob
    2. if blaa2 = blubb2 then bloooob2
    3. end if '<---
    4. end if '<---



    Trudi schrieb:

    Deklarieren

    VB.NET-Quellcode

    1. Dim variable As String


    Definieren

    VB.NET-Quellcode

    1. variable = "string"

    xDD Ich glaube das meine er nicht.
    Iwas klappt bei ihm nicht mit seiner If Abfrage. Kein Wunder wenn diese nicht geschlossen sind ( End if )

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

    Deklarieren

    VB.NET-Quellcode

    1. Dim variable As String


    Definieren

    VB.NET-Quellcode

    1. variable = "string"





    VB.NET-Quellcode

    1. If variable = "string"
    2. MsgBox("variable ist String")
    3. elseif variable="hallo" ' <-- Für eine Elseif Anweisung muss ein If-Block angefangen werden (siehe oben)
    4. MsgBox("Hallo! ")
    5. else
    6. MsgBox("Nicht Hallo oder String") ' Tritt auf wenn 'variable' nicht gleich 'string' oder 'hallo' ist.


    Les dir die Stelle mit If-Schleifen nochmal durch ;)

    Gruß, Trudi
    Ihr versteht einfach meine Frage nicht..

    ICh versteht das schon mit ElseIf und Else..

    ElseIf ist halt das noch erweitern des If Blocks und Else ist wenn das nicht zutrifft das is mir doch klar bloß ich will das wenn der Benutzer nichts eingibt die MsgBox "bitte werte eingeben" kommt..

    Das Problem ist hier:





    Das passiert nach dem Ausführen wenn man nichts in den TextBoxen eingibt..ich will halt das wenn man nichts in den TextBoxen eingibt die Laufzeit aufhört und neu anfängt..mit Schleifen hat ichs auch schon versucht und mit Exit Sub..

    Und noch was zum Deklarieren: Wo kann man Deklarieren das man die Deklarierten Begriffe überall verwenden kann anstatt gerade nur in dem Main Block?

    n0ise schrieb:



    Und noch was zum Deklarieren: Wo kann man Deklarieren das man die Deklarierten Begriffe überall verwenden kann anstatt gerade nur in dem Main Block?


    Variablen die Programmweit abgefangen werden können werden über dem Formload Event festgelegt

    VB.NET-Quellcode

    1. Private Structure Variabelensammlung
    2. Public Text As string
    3. End Structure
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. End Sub


    VB.NET-Quellcode

    1. Public Text As string
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. End Sub
    Mache es mal so:

    1. Controls benennen (Dann geht aus dem Namen bereits die Funktion hervir (cmdComputer, optAdd, optSubtract, optMultiply, optDivide)

    2. Konvertierung mit fehlerprävention (Standradbeispiel: was ist "Apfel" + "Brine")

    VB.NET-Quellcode

    1. Dim a,b As Integer
    2. If Interger.TryParse(txtA.Text, a) AndAlso Integer.TryParse(txtB.Text, b) Then
    3. 'Berechnen
    4. Else
    5. 'Meckern: Ungültige Eingabe
    6. End If


    3. Optimierung der RadioButtons

    VB.NET-Quellcode

    1. Dim op As Operation
    2. Private Enum Operation
    3. Add
    4. Subtract
    5. Multiply
    6. Divide
    7. End Enum
    8. Private Sub optChanged(ByVal sender As Object, e As System.EventArgs) Handles optPlus.CheckedChanged, optMinus.CheckedChanged 'usw.
    9. For Each ctrl As Control In Me.Controls 'Alle "Aus"
    10. If TypeOf ctrl Is RadioButton Then DirectCast(ctrl, RadioButton).Checked = False
    11. Next
    12. DirectCast(sender, RadioButton).Checked = True 'Aktuellen "An"
    13. Select Case DirectCast(sender, RadioButton).Name.Substring(3) 'Lässt das prefix "opt" weg (gibt "Add", "Subtract etc.)
    14. Case "Add" : op = Add
    15. Case "Subtract" : op = Subtract
    16. Case "Multiply" : op = Multiply
    17. Case "Divide" : op = Divide
    18. End Select
    19. End Sub


    4. Die Operation selbst:

    VB.NET-Quellcode

    1. 'Schritt 1 direkt davor
    2. Dim res As Integer = 0
    3. Select Case op
    4. Case Add : res = a + b
    5. Case Subtract : res = a - b
    6. Case Multiply : res = a * b
    7. Case Divide : res = a / b
    8. End Select
    9. llResult.Text = res.ToString() 'Label, welches das Ergebnis anzeigt - Messageboxen sind dafür ungeeignet.
    10. 'MessageBox.Show fällt damit auch weg.