Frage zum Taschenrechner auf einer anderen Art

  • VB.NET

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

    Passiert genau das gleiche..ist ja auch klar das er dann den Fehler anzeigt weil ein Leerzeichen keine Zahl ist..

    Kann der nicht wenn man nichts in den TextBoxen eingibt den Code stoppen? Und wenn man was eingibt weiterlaufen lassen?


    VB.NET-Quellcode

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


    Hier genau das gleiche..


    Außerdem:

    Visual Basic Quellcode


    If TextBox1.Text = "" OrElse TextBox2.Text = "" Then
    MsgBox("Bitte ein Wert eingeben!")
    End If

    Ist doch auch genau das selbe..lol
    nö tut mir leid ist nicht dasselbe...
    hier nochmal mit Trim optimiert, falls ein Spaßvogel Leerzeichen eingibt:
    +anschließend noch wunderschön mit den .Net mitteln TryParse

    VB.NET-Quellcode

    1. If TextBox1.Text.Trim() = "" OrElse TextBox2.Text.Trim() = "" Then
    2. MsgBox("Bitte ein Wert eingeben!")
    3. Exit Sub
    4. End If
    5. Dim x As Integer=0,y As Integer=0
    6. If Integer.TryParse(TextBox1.Text.Trim(),x) AndAlso Integer.TryParse(TextBox2.Text.Trim(),y)
    7. 'Hier deine rechenlogik mit x und y als Zahlen...
    8. Else
    9. MsgBox("Keine gültigen Zahlen")
    10. End If
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. If IsNumeric(TextBox1.Text & TextBox2.Text) = False Then
    2. MessageBox.Show("Bitte Zahlen eingeben!")
    3. Exit Sub
    4. End If
    5. Dim x As Integer = CInt(TextBox1.Text)
    6. Dim y As Integer = CInt(TextBox2.Text)
    7. Dim ergebnis As Integer
    8. Select Case True
    9. Case CheckBox1.Checked
    10. ergebnis = x + y
    11. Case CheckBox2.Checked
    12. ergebnis = x - y
    13. Case CheckBox3.Checked
    14. ergebnis = CInt(x / y)
    15. Case CheckBox4.Checked
    16. ergebnis = x * y
    17. End Select
    18. MessageBox.Show("Das Ergebnis ist: " & ergebnis) ' Ergebnis anzeigen + Text
    19. End Sub



    So hab ichs jetzt ^^

    Ok also Exit Sub heißt der Befehl =)

    Nochne kurze Frage zum Schluss..ich habe gerad in mein VB.NET Buch die "Function" gerlernt und danach kommen die Prozeduren..

    Also zur Frage: Eine Funktion ist doch eigentlich nur eine Zusammenfassung, was den gleichen Wert hat wie zB andere Variablen die man einzelnd Deklariern kann und mit dem Funktionsname verwenden kann?

    So wie hier:

    VB.NET-Quellcode

    1. Function Brutto(Netto As Decimal, _
    2. MwSt As Decimal) As Decimal
    3. Return Netto * (1.0 + MwSt/100.0)
    4. End Function


    Hier wurden ja 2 Variablen Deklariert (Netto, MwSt) und man kann sie mit dem Namen Brutto aufrufen der auch als Decimal deklariert wurde?

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

    Hier wurden ja 2 Variablen Deklariert (Netto, MwSt) und man kann sie mit
    dem Namen Brutto aufrufen der auch als Decimal deklariert wurde?
    Also das trifft es nicht ganz. Es ist eine Funktion namens Brutto, die mit zwei Parametern eine Berechnung durchführt und das Ergebnis zurückgibt.
    Netto und MwSt werden hierbei nur innerhalb der Funktion benutzt, bzw wird Brutto bei der Parameterübergabe Werte des angegebenen Typs erwarten. Die Intellisense wird dabei im Tooltip anzeigen, welcher Typ als jeweiliger Parameter erwartet wird.

    Ähnliches hier:

    VB.NET-Quellcode

    1. Private Function AddiereIrgendwas(ByVal wert1 As Integer, ByVal wert2 As Integer)
    2. Dim summe As Integer = wert1 + wert2
    3. Return summe
    4. End Function
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. MsgBox(AddiereIrgendwas(10, 15).ToString)
    7. End Sub


    Weitere Erklärungen kannst du sicherlich hier finden.

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

    Eine Funktion ist das gleiche wie eine Prozedur (Sub), mit dem Unterschied dass die Funktion einen Wert an den Aufrufer zurückgibt. Dein Beispiel verlangt die Übergabe zweier Dezimalzahlen um das Ergebnis mit Return zurückzugeben. Der Aufruf erfolgt dann mit:

    VB.NET-Quellcode

    1. Dim Bruttoergebnis as Decimal = Brutto( 44.0, 19.0)

    Dann eins noch:

    VB.NET-Quellcode

    1. If IsNumeric(TextBox1.Text & TextBox2.Text) = False Then
    2. End If
    Dieser Ausdruck TextBox1.Text & TextBox2.Text ist eine logische Verknüpfung, würde also die Texteigenschaften der beiden TBs mit & verknüpfen. Was kommt raus bei "Kamel" & "Fahrrad"? :D Evtl. ein Rad fahrendes Kamel. Das wird dann auf Isnumeric geprüft... Auch "12" & "10" ergibt kein logisches Ergebnis, da beide Werte kein Boolean sind.
    Merke: & erwartet 2 Boolsche Werte (True/False), die miteinander verknüpft werden.

    Deine Abfrage muß wie folgt aussehen:

    VB.NET-Quellcode

    1. If Not IsNumeric(TextBox1.Text) AndAlso Not IsNumeric(TextBox2.Text) Then
    2. End If

    Außerdem ist der Ansatz mit Tryparse intelligenter. In diesem Beitrag habe ich schonmal eine Variante zum Prüfen auf richtige Eingabe geschrieben. Die hat den Vorteil, dass Fehleingaben einfach nur ignoriert werden und keine nochmalige Eingabe erforderlich ist. Wenn du hier bei erfolgreicher Prüfung (z.B. TB.Text.Lenght > 0) einen boolschen Wert setzen würdest, hättest du alle Prüfungen erledigt. Deine Sub enthält damit nur noch das, was sie machen soll: Rechnen...
    Fiel Fergnügen
    Vatter

    Edit: Oh Gott, was hab ich da geschrieben? :thumbdown: Sry
    Noch 5 kaffee, dann wird es hoffentlich besser.
    & ist selbstverständlich KEINE logische Verknüpfung. Das funzt schon so, wie du es geschrieben hast, ich finde das andere aber schönerer.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

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

    Okay, und was hat ByVal und ByRef auf sich?

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Test(ByVal txt As String, _
    3. ByRef Netto As Decimal, _
    4. ByRef Preis As Decimal)
    5. ' Ändere die Werte
    6. txt = "Neuer Text"
    7. Netto = 15.0
    8. Preis = 16.0
    9. End Sub
    10. Sub Main()
    11. Dim Text As String = "Alter text"
    12. Dim Wert1 As Decimal = 0.0
    13. Dim Wert2 As Decimal = 0.0
    14. Console.WriteLine(Text & " " & _
    15. Wert1.ToString() & " " & _
    16. Wert2.ToString())
    17. Test(Text, Wert1, Wert2)
    18. Console.WriteLine(Text & " " & _
    19. Wert1.ToString() & " " & _
    20. Wert2.ToString())
    21. Console.ReadLine()
    22. End Sub
    23. End Module



    Hier hat es doch die Bedeutung das zb hier:

    VB.NET-Quellcode

    1. Test(Text, Wert1, Wert2)


    Das wegen ByVal das "Programm" nicht mitkriegt das es geändert wurde in "Alter Text" ?

    Und was is mit ByRef?
    Guckst du hier, da solltest du Antworten finden.

    Übrigens,
    " Das wegen ByVal das "Programm" nicht mitkriegt das es geändert wurde in "Alter Text" ? "

    arbeite an deiner Ausdrucksweise, so versteht doch keiner was du eigentlich fragst. Schon der Thread-Titel stürzt sicher so manchen Deutschlehrer in tiefe Verzweiflung. :P
    ich hoffe nicht denn das war eines der wenigen vernünftigen Lösungen von hier ;)
    Meiner wurde es wohl auch...
    Ehrlich gesagt war das ebenfalls bereits C&P.

    BTW: Trim() ist bei TryParse() meines Wissens nach unnötig (selbes Ergebnis).
    Und: Wenn keine Eingabe erfolgt ist, schlägt TryParse ebenfalls Alarm, sodass man direkt keine Eingabe und ungültige Eingabe abfängt.

    BTW2: ByRef macht eigentlich nur Sinn, wenn der übergebene Wert sehr Groß ist (da ByVal kopiert) oder wenn der Wert durch die Sub/ Function geändert werden soll.

    BTW3: Strings sind leer, wenn .Length = 0 gilt. das ist schneller und sauberer. Wenn unbedingt der Text genommen werden soll, dann mit String.Empty statt "":

    VB.NET-Quellcode

    1. If txtA.Text.Trim().Length = 0 OrElse txtB.Text.Trim().Length = 0 Then
    Ich habe mal eine Funktion geschrieben die solange eine eigens gerierte Liste an IFormatStyles durchgeht bis es eine Lösung hat. Der Nachteil daran war dass es auch eine Eingabe hätte geben können die dann falsch interpretiert wird und somit falsch umgerechnet. Dann kann man sich bei der Usereingabe aber halbwegs sicher sein, dass es NICHT an dem Programmierer liegt, dass nichts gerechnet werden kann.

    FAtheone schrieb:

    BTW2: ByRef macht eigentlich nur Sinn, wenn der übergebene Wert sehr Groß ist (da ByVal kopiert) oder wenn der Wert durch die Sub/ Function geändert werden soll.

    ByRef macht nur in deinem 2. Fall Sinn. Egal ob im Decimal 1.2 steht oder 4938290693456.43986593499652693, es wird immer der gleiche Platz verbraucht.

    lg SeriTools
    | Keine Fragen per PN oder Skype.
    BTW: Trim() ist bei TryParse() meines Wissens nach unnötig (selbes Ergebnis).

    Man hat aber dann keine Unterscheidung von Ungültige Eingabe zu keine Eingabe :P - Gut man hätte es beim schließlichen TryParse noch weglassen können...
    BTW3: Strings sind leer, wenn .Length = 0 gilt. das ist schneller und sauberer. Wenn unbedingt der Text genommen werden soll, dann mit String.Empty statt "":

    String.Empty und "" sind identisch, es macht keinen unterschied, es sind beides Konstanten...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---