none
calculator RRS feed

  • Frage

  • hallo zusammen, bin ein Vb-Anfänger, habe gerade mein erstes projekt beendet ( einen Editor) und vor kurzem habe ich mich an ein neues Projekt gewagt, ein Rechner. Irgendwie will er aber nicht funktionieren:

     

      Dim Verfahren As Boolean
      
      Private Sub Plus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Plus.Click
        Verfahren(1) = True
      End Sub
    
      Private Sub Minus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Minus.Click
        Verfahren(2) = True
      End Sub
    
      Private Sub Mal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mal.Click
        Verfahren(3) = True
      End Sub
    
      Private Sub Durch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Durch.Click
        Verfahren(4) = True
      End Sub
    
      Private Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
    
        If Verfahren(1) = True Then
          Lösungsbox.Text = Eingabebox1.Text + Eingabebox3.Text
        End If
    
        If Verfahren(2) = True Then
          Lösungsbox.Text = Eingabebox1.Text - Eingabebox3.Text
        End If
    
        If Verfahren(3) = True Then
          Lösungsbox.Text = Eingabebox1.Text * Eingabebox3.Text
        End If
    
        If Verfahren(4) = True Then
          Lösungsbox.Text = Eingabebox1.Text / Eingabebox3.Text
        End If
      End Sub

    Bitte helft mir!

    • Verschoben Thorsten Dörfler Sonntag, 29. August 2010 13:26 Thema VB.NET (aus:Visual Basic 6.0 - Interoperabilität und Upgrade)
    Sonntag, 29. August 2010 12:13

Antworten

  • Hallo,

    die Text-Eigenschaften enthält Text, wie der Name schon sagt.
    Und mit Texten kann man schlecht rechnen, siehe dazu
    Peter Götz Erläuterungen zu einem vergleichbaren Problem in:
    Ungültige Konvertierung in Typ Doble - Konvertierungsproblem beim Subtrahieren eines zuvor über Addition hinzugefügten Bereichs

    und "Käsekuchen" - "Apfelmus" willst Du kaum rechnen ;-)

    Und wenn Du wie dort empfohlen Option Strict On aktivierst,
    wird Dich der der auch Visual Basic Compiler darauf hinweisen.
    Und Du solltest Dich mal beschäftigen mit: Typkonvertierung in Visual Basic

    Einige mögliche Lösungen findest Du u. a. in
    Taschenrechner, Ausgabe vom Ergebnis

    Gruß Elmar

     

    Sonntag, 29. August 2010 14:08
  • Hallo,

    hallo zusammen, bin ein Vb-Anfänger, habe gerade
    mein erstes projekt beendet ( einen Editor) und vor
    kurzem habe ich mich an ein neues Projekt gewagt,
    ein Rechner. Irgendwie will er aber nicht funktionieren:


    Erst mal solltest Du bei Deinen Projekteigenschaften
    "Option Explicit " UND "Option Strict" einschalten damit
    Dir Intellisense schon bei der Codeerstellung zeigt, wenn
    Du Fehler bei Deklarationen machst oder mit unpassenden
    Datentypen operierst.

    [code]
     Dim Verfahren As Boolean

    Du deklarierst hier eine einfache Variable vom Typ Boolean.
    Später versuchst Du jedoch auf ein Array Verfahren(1), Verfahren(2),
    Verfahren(...) zuzugreifen, welches Du gar nicht deklariert hast.

    Es sollte also in Deinem Code eine Deklaration

        Private Verfahren(x) as Boolean

    geben, wobei x die Obergrenze des Arrays angibt.
    Da die Untergrenze bei Arrays in .net immer 0 ist
    wäre die Deklaration für 4 Teilvariablen Deines Arrays

        Private Verfahren(3) as Boolean

    und Du hättest damit

        Verfahren(0)
        Verfahren(1)
        Verfahren(2)
        Verfahren(3)


     Private Sub Plus_Click _
           (ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
           ) Handles Plus.Click

       Verfahren(1) = True

    ersetze durch
        Verfahren(0) = True

    End Sub

     Private Sub Minus_Click _
           (ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
            ) Handles Minus.Click

       Verfahren(2) = True

    ersetze durch
        Verfahren(1) = True

    End Sub

     Private Sub Mal_Click _
            (ByVal sender As System.Object, _
              ByVal e As System.EventArgs _
             ) Handles Mal.Click

       Verfahren(3) = True

    ersetze durch
        Verfahren(2) = True

    End Sub

     Private Sub Durch_Click _
            (ByVal sender As System.Object, _
             ByVal e As System.EventArgs _
             ) Handles Durch.Click
       Verfahren(4) = True

    ersetze durch
        Verfahren(3) = True

    End Sub

     Private Sub Button14_Click _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                 ) Handles Button14.Click

       If Verfahren(1) = True Then

    if Verfahren(0) then

         Lösungsbox.Text = Eingabebox1.Text + Eingabebox3.Text

    Eingabebox1.Text liefert einen String, ebenso liefert
    Eingabebox3.Text einen String.
    Mit Strings kann man aber nicht rechnen. Zum Rechnen
    braucht man Zahlen wie z.B. Integer, Single, Double usw.

    Du musst also erst mal die in Deinen Textboxen stehenden
    Strings überprüfen, ob sie überhaupt irgendwelche "rechenbare"
    Zahlenwerte darstellen. Das kann man am besten mit den
    TryParse-Funktionen der div. Datentypen, wie z.B.

        Dim Result as Double
        if Double.TryParse(EingabeBox1.Text, Result) Then
            ' Inhalt von EingabeBox1.Text stellt eine Zahl dar.
        else
            ' Inhalt von EingabeBox1.Text stellt keine Zahl dar.
        end if

       End If

       If Verfahren(2) = True Then
         Lösungsbox.Text = Eingabebox1.Text - Eingabebox3.Text

    Auch hier gilt wieder das Selbe wie oben:
    Mit Strings kann man nicht rechnen. Zum
    Rechnen braucht man Zahlen.

       End If

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Sonntag, 29. August 2010 15:02

Alle Antworten

  • Hallo,

    die Text-Eigenschaften enthält Text, wie der Name schon sagt.
    Und mit Texten kann man schlecht rechnen, siehe dazu
    Peter Götz Erläuterungen zu einem vergleichbaren Problem in:
    Ungültige Konvertierung in Typ Doble - Konvertierungsproblem beim Subtrahieren eines zuvor über Addition hinzugefügten Bereichs

    und "Käsekuchen" - "Apfelmus" willst Du kaum rechnen ;-)

    Und wenn Du wie dort empfohlen Option Strict On aktivierst,
    wird Dich der der auch Visual Basic Compiler darauf hinweisen.
    Und Du solltest Dich mal beschäftigen mit: Typkonvertierung in Visual Basic

    Einige mögliche Lösungen findest Du u. a. in
    Taschenrechner, Ausgabe vom Ergebnis

    Gruß Elmar

     

    Sonntag, 29. August 2010 14:08
  • Hallo,

    hallo zusammen, bin ein Vb-Anfänger, habe gerade
    mein erstes projekt beendet ( einen Editor) und vor
    kurzem habe ich mich an ein neues Projekt gewagt,
    ein Rechner. Irgendwie will er aber nicht funktionieren:


    Erst mal solltest Du bei Deinen Projekteigenschaften
    "Option Explicit " UND "Option Strict" einschalten damit
    Dir Intellisense schon bei der Codeerstellung zeigt, wenn
    Du Fehler bei Deklarationen machst oder mit unpassenden
    Datentypen operierst.

    [code]
     Dim Verfahren As Boolean

    Du deklarierst hier eine einfache Variable vom Typ Boolean.
    Später versuchst Du jedoch auf ein Array Verfahren(1), Verfahren(2),
    Verfahren(...) zuzugreifen, welches Du gar nicht deklariert hast.

    Es sollte also in Deinem Code eine Deklaration

        Private Verfahren(x) as Boolean

    geben, wobei x die Obergrenze des Arrays angibt.
    Da die Untergrenze bei Arrays in .net immer 0 ist
    wäre die Deklaration für 4 Teilvariablen Deines Arrays

        Private Verfahren(3) as Boolean

    und Du hättest damit

        Verfahren(0)
        Verfahren(1)
        Verfahren(2)
        Verfahren(3)


     Private Sub Plus_Click _
           (ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
           ) Handles Plus.Click

       Verfahren(1) = True

    ersetze durch
        Verfahren(0) = True

    End Sub

     Private Sub Minus_Click _
           (ByVal sender As System.Object, _
            ByVal e As System.EventArgs _
            ) Handles Minus.Click

       Verfahren(2) = True

    ersetze durch
        Verfahren(1) = True

    End Sub

     Private Sub Mal_Click _
            (ByVal sender As System.Object, _
              ByVal e As System.EventArgs _
             ) Handles Mal.Click

       Verfahren(3) = True

    ersetze durch
        Verfahren(2) = True

    End Sub

     Private Sub Durch_Click _
            (ByVal sender As System.Object, _
             ByVal e As System.EventArgs _
             ) Handles Durch.Click
       Verfahren(4) = True

    ersetze durch
        Verfahren(3) = True

    End Sub

     Private Sub Button14_Click _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                 ) Handles Button14.Click

       If Verfahren(1) = True Then

    if Verfahren(0) then

         Lösungsbox.Text = Eingabebox1.Text + Eingabebox3.Text

    Eingabebox1.Text liefert einen String, ebenso liefert
    Eingabebox3.Text einen String.
    Mit Strings kann man aber nicht rechnen. Zum Rechnen
    braucht man Zahlen wie z.B. Integer, Single, Double usw.

    Du musst also erst mal die in Deinen Textboxen stehenden
    Strings überprüfen, ob sie überhaupt irgendwelche "rechenbare"
    Zahlenwerte darstellen. Das kann man am besten mit den
    TryParse-Funktionen der div. Datentypen, wie z.B.

        Dim Result as Double
        if Double.TryParse(EingabeBox1.Text, Result) Then
            ' Inhalt von EingabeBox1.Text stellt eine Zahl dar.
        else
            ' Inhalt von EingabeBox1.Text stellt keine Zahl dar.
        end if

       End If

       If Verfahren(2) = True Then
         Lösungsbox.Text = Eingabebox1.Text - Eingabebox3.Text

    Auch hier gilt wieder das Selbe wie oben:
    Mit Strings kann man nicht rechnen. Zum
    Rechnen braucht man Zahlen.

       End If

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Sonntag, 29. August 2010 15:02
  • Hallo Jedi,

    das ist zwar keine direkte Antwort auf deine Frage aber ein Denkanstoß. Kennst du einen Taschenrechner der mehrer Displays hat?
    Eigentlich erwartet man doch von einem Claculator, dass man einen Zahl eingibt (wenn du auch Kommazahlen zulassen möchtest, sollten deine Vataiblen keine Integer-Variblen sein).

    Dann solltest du dir Gedanken machen, ob dein Rechner "nur" per Mausklick oder auch auf Tastendruck funktionieren soll. Den Erfolg deiner Berechnungen kannst du ja separat (z.B. in Labels ausgeben) von einem Calculator erwartet man aber ein Display.

     


    Liebe Grüße Stefan
    Sonntag, 29. August 2010 19:13
  • vielen Dank allen auch für die Links, doch habe ich gemerkt, dass ich nicht unbedingt konvertieren muss mit Folgendem Code funktioniert er ( nur mit der Array-Änderung)

     

    Public Class Form4
    
      Dim Verfahren(3) As Boolean
      
      Private Sub Plus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Plus.Click
        Verfahren(0) = True
      End Sub
    
      Private Sub Minus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Minus.Click
        Verfahren(1) = True
      End Sub
    
      Private Sub Mal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mal.Click
        Verfahren(2) = True
      End Sub
    
      Private Sub Durch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Durch.Click
        Verfahren(3) = True
      End Sub
    
      Private Sub Button14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button14.Click
    
        If Verfahren(0) = True Then
          Lösungsbox.Text = Eingabebox1.Text + Eingabebox3.Text
        End If
    
        If Verfahren(1) = True Then
          Lösungsbox.Text = Eingabebox1.Text - Eingabebox3.Text
        End If
    
        If Verfahren(2) = True Then
          Lösungsbox.Text = Eingabebox1.Text * Eingabebox3.Text
        End If
    
        If Verfahren(3) = True Then
          Lösungsbox.Text = Eingabebox1.Text / Eingabebox3.Text
        End If
      End Sub
    End Class
    
    Montag, 30. August 2010 15:43
  • Hallo,

     doch habe ich gemerkt, dass ich nicht unbedingt konvertieren muss

    auch wenn es "funktioniert", solltest Du die Tipps und Hinweise annehmen. Zumindest, wenn Du mal in die richtige Programmierung einsteigen solltest. Es wird Dir das Leben enorm erleichtern, wenn Du mal einen Fehler suchst.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 30. August 2010 16:27
  • Hallo,

    vielen Dank allen auch für die Links, doch habe ich gemerkt,
    dass ich nicht unbedingt konvertieren muss

    Genau das solltest Du aber unbedingt.
    Schalte bei Deinen Objekteigenschaften mal
    Option Explicit und Option Strict ein.

    mit Folgendem Code funktioniert er ( nur mit der Array-Änderung)


    Public Class Form4 ... schnipp... Private Sub Button14_Click _ (ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles Button14.Click If Verfahren(0) = True Then

    Hier solltest Du einfach schreiben If Verfahren(0) then

    Lösungsbox.Text = Eingabebox1.Text + Eingabebox3.Text End If

    Lösungsbox.Text erwartet einen String. Von Eingabebox1.Text und in Eingabebox3.Text bekommst Du ebenfalls Strings. Diese Strings können, aber müssen nicht unbedingt Ausdrücke sein, welche eine Zahl darstellen. Offenbar möchtest Du aber doch zwei Zahlen aber eben nicht zwei Strings addieren. Wenn Eingabebox1.Text und Eingabebox3.Text jeweils eine Zahlendarstellung enthalten, dann solltest Du diese erst in numerische Datentypen (z.B. via Double.TryParse) umwandeln und dann mit den so erhaltenen numerischen Werten rechnen. Mit Strings, wie Du es machst kann man nicht rechnen. Welches Ergebnis würdest Du denn bei nachfolgender Rechnung erwarten? Dim Ergebnis as String = "Käsekuchen" + "Apfelmus" Du würdest in Ergebnis den String "KäsekuchenApfelmus" erhalten. Wobei die für VB.net richtigerer Schreibweise Dim Ergebnis as String = "Käsekuchen" & "Apfelmus" das selbe Ergebnis liefern würde. Strings werden in VB.net mit dem Plus-Operator (&) verknüpft. Die Verknüpfung von Strings mit dem Plus-Operator (+) ist lediglich aus Kompatibiliätsgründen vorhanden und sollte der besseren Lesbarkeit und auch noch aus anderen Gründen besser nicht verwendet werden. Sinnvoller wäre wohl doch etwas wie Dim Ergebnis as Double = 25.3 + 17

    If Verfahren(1) = True Then Lösungsbox.Text = Eingabebox1.Text - Eingabebox3.Text

    Spätestens jetzt dürfte Dein vorstehender Code einen Fehler auslösen, da man Strings nicht subtrahieren kann. Im Gegensatz zu der aus Kompatibilitätsgründen vorhandenen Möglichkeit Strings via Plus-Operator (+) zu verknüpfen, gibt es für Strings keinen Minus-Operator (-).

    End If If Verfahren(2) = True Then Lösungsbox.Text = Eingabebox1.Text * Eingabebox3.Text

    Auch hier verwendest Du einen für Strings nicht vorhandenen Operator, nämlich den *. Auch hier solltest Du überlegen, welches Ergebnis "Käsekuchen" * "Apfelmus" liefern sollte. Also erst mal die Strings, welche Zahlen darstellen zu echten numerischen Werten (z.B. Double) umwandeln und erst dann damit rechnen.

    End If If Verfahren(3) = True Then Lösungsbox.Text = Eingabebox1.Text / Eingabebox3.Text

    Was für - und * gilt, gilt ebenso für /. Auch diesen Operator gibt es nicht für Strings.

    End If End Sub End Class

    Wie schon in meiner früheren Antwort erwähnt, solltest Du Dir
    unbedingt mal die Online-Hilfe zu den Umwandlungsfunktionen
    .TryParse und/oder .Parse der verschiedenen Datentypen ansehen
    und diese dann auch sinnvoll einsetzen, anstatt zu versuchen
    "Käsekuchen" und "Apfelmus" zu multiplizieren oder sonstwie
    zu vergewaltigen.
    Und auch nochmal der Hinweis, bei allen Deinen Projekten
    Option Explicit und Option Strict einzuschalten.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 30. August 2010 16:30
  • Ja hab natürlich es nicht dabei belassen, hab es so gemach:
      If Verfahren(0) = True Then
          Lösungsbox.Text = CType(Eingabebox1.Text, Double) + CType(Eingabebox3.Text, Double)
        End If
    
        If Verfahren(1) = True Then
          Lösungsbox.Text = CType(Eingabebox1.Text, Double) - CType(Eingabebox3.Text, Double)
        End If
    
        If Verfahren(2) = True Then
          Lösungsbox.Text = CType(Eingabebox1.Text, Double) * CType(Eingabebox3.Text, Double)
        End If
    
        If Verfahren(3) = True Then
          Lösungsbox.Text = CType(Eingabebox1.Text, Double) / CType(Eingabebox3.Text, Double)
        End If
    

    Zudem hab ich noch Folgendes hinzugefügt, funktioniert aber nicht ganz , soll prüfen obs ne Zahl ist:

    If Not Double.TryParse(Eingabebox1.Text) Then
          MessageBox.Show("Sie müssen eine Zahl eingeben!", "Fehler", MessageBoxButtons.OK)
        End If
    
        If Not Double.TryParse(Eingabebox3.Text) Then
          MessageBox.Show("Sie müssen eine Zahl eingeben!", "Fehler", MessageBoxButtons.OK)
        End If
    
    Montag, 30. August 2010 16:36
  • Hallo,

    Ja hab natürlich es nicht dabei belassen,
    hab es so gemach:

    Und warum machst Du es nicht so, wie aus gutem
    Grunde vorgeschlagen?

    [code]

     If Verfahren(0) = True Then
         Lösungsbox.Text = CType(Eingabebox1.Text, Double) + CType(Eingabebox3.Text, Double)

    Hast Du mal überlegt, was passiert, wenn Eingabebox1.Text
    und/oder Eingabebox3.Text irgendeinen String enthalten, der
    sich via cType() nicht zu einem numerischen Wert wie Double
    umwandeln lässt?

    Dein Code wird einen Fehler auslösen, den Du aber nicht
    behandelst. Ergebnis ist, dass Dein Programm mit einer
    Fehlermeldung abstürzt.

       End If

    ... schnipp...

    Zudem hab ich noch Folgendes hinzugefügt,

    Wo hast Du das hinzugefügt?

    funktioniert aber nicht ganz , soll prüfen obs ne Zahl ist:
    [code]

    If Not Double.TryParse(Eingabebox1.Text) Then

    Da solltest Du Dir mal die Online-Hilfe zu Double.TryParse()
    ansehen und Dein Code würde dann eher so aussehen:

        Dim Value as Double
        If Double.TryParse(EingabeBox1.Text, Value) then
            ' EingabeBox1.Text enthält eine Zahlendarstellung
            ' Rechne was
        else
            ' EingabeBox1.Text enthält keine Zahlendarstellung
            ' MsgBox("Sie Müssen eine Zahl eingeben")
        End if

         MessageBox.Show("Sie müssen eine Zahl eingeben!", "Fehler", MessageBoxButtons.OK)
       End If

       If Not Double.TryParse(Eingabebox3.Text) Then
         MessageBox.Show("Sie müssen eine Zahl eingeben!", "Fehler", MessageBoxButtons.OK)
       End If

    Deine Abfragen auf Not Double.TryParse wären im Prinzip schon
    ok, die Frage bleibt jedoch, wie und wann rufst Du diese Abfragen
    in Deinem Code auf?

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 30. August 2010 18:21