MsgBox als Fehlermeldung erscheint nicht immer

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Dennis.

    MsgBox als Fehlermeldung erscheint nicht immer

    Guten Tag,

    ich bin ganz neu hier und möchte gerne anfangen VB.Net zu lernen!

    Im Moment bastel ich an meinem ersten Programm das mir ein Gewicht errechnet.
    Das funktioniert auch sehr gut und so dachte ich mir das ich noch die TextBoxen auf Inhalt überprüfe und nun stecke ich etwas fest.

    Ich wollte das alle leeren Felder rot eingefärbt werden und eine MsgBox aufploppt mit dem Inhalt das alle roten Felder ausgefüllt werden müssen.
    Wenn ich jetzt aber z.B. TextBox1 und TextBox2 ausfülle und TextBox3 nicht dann funktioniert das auch peferkt.

    Lösche ich nun den Inhalt aus einem der beiden und fülle dafür TextBox 3 aus müsste wieder die MsgBox kommen aber das tut sie nicht, obwohl die Hintergrundfarbe sich so ändert wie sie soll.

    Anbei mein Quelltext (bitte nicht flamen, ist mein erstes Programm), obwohl ich mir sicher bin das es elegantere Wege gibt mein Vorhaben zu lösen als diese ganzen If Anweisungen fehlt mir halt noch das Wissen dafür.
    Bin deshalb Stolz wie Otto auf mein bisheriges Programm :thumbsup: !

    Kann mir eventuell jemand sagen wie ich es schaffe das die MsgBox immer kommt sobald eine TextBox rot ist?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Ergebnis As Double
    4. Ergebnis = Val(TextBox1.Text) * Val(TextBox2.Text) * Val(TextBox3.Text) * (7.85 / 1000000)
    5. If TextBox1.Text = "" Then
    6. TextBox1.BackColor = System.Drawing.Color.Red
    7. Else
    8. TextBox1.BackColor = System.Drawing.Color.White
    9. End If
    10. If TextBox2.Text = "" Then
    11. TextBox2.BackColor = System.Drawing.Color.Red
    12. Else
    13. TextBox2.BackColor = System.Drawing.Color.White
    14. End If
    15. If TextBox3.Text = "" Then
    16. TextBox3.BackColor = System.Drawing.Color.Red
    17. Else
    18. TextBox3.BackColor = System.Drawing.Color.White
    19. End If
    20. If TextBox1.BackColor = System.Drawing.Color.Red Or
    21. TextBox1.BackColor = System.Drawing.Color.Red Or
    22. TextBox1.BackColor = System.Drawing.Color.Red Then
    23. MsgBox("Bitte allen roten Feldern einen Wert geben!", MsgBoxStyle.Information)
    24. Else
    25. Label4.Text = Math.Round(Ergebnis)
    26. End If
    27. End Sub
    28. End Class
    Moin,
    1. Option Strict On! Ein Text eines Label ist ein ​String und kein ​Double.
    2. Nutze ​MessageBox.Show anstatt ​MsgBox, das ist sauberer.
    3. Gib' Deinen Controls richtige Namen.
    4. Solltest Du nicht ​Val benutzen, sondern die Eingaben korrekt parsen. (​Double.TryParse oder gar ein ​NumericUpDown verwenden)
    5. Würde ich ​String.IsNullOrEmpty verwenden und direkt dann die MessageBox anzeigen und nicht dann noch die Hintergrundfarbe abfragen, das sollte nicht das Kriterium sein, sondern eben direkt die falsche Eingabe.
    6. Verwende zukünftig ​OrElse statt einfachem ​Or.
    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    ich hab deinen Code nur soweit angeguckt, dass ich sehe, dass du die Voreinstellungen noch drinne hast, mit denen Visualstudio ausgeliefert wird.
    Das ist extrem schlecht, denn auf diese Weise kannst du gar nicht das Wesen objektorientierter Programmierung erfassen.
    Stattdessen übst du ununterbrochen einen ganz schlimmen Stil ein, und das später wieder abzugewöhnen ist erfahrungsgemäß urs schwierig (zumal dann ja auch oft zehntausende Zeilen gecodet sind - bis man von selber drauf kommt)

    Daher: Visual Studio - Empfohlene Einstellungen

    Edit: zu spät - aber Guck 1), 2), 4), 5) - ich bin nicht der einzige, dem das ins Auge sticht. Mit den richtigen Einstellungen ist sowas alles nicht möglich, und du bist gezwungen, sauber zu programmieren.
    Was sich in kürzester Zeit hundertfach auszahlt.
    Ok Danke!
    Kann man das "Option Strict On" generell in Visual Studio umstellen oder muss man das jedes Mal in den Projekteigenschaften aktivieren bzw. in den Quellcode einfügen?

    Finde da nämlich außer in den Projekteigenschaften keine entsprechende Option für eine globale Einstellung :| .

    Edit: Habs gefunden!

    Dennis schrieb:

    VB.NET-Quellcode

    1. Ergebnis = Val(TextBox1.Text) * Val(TextBox2.Text) * Val(TextBox3.Text) * (7.85 / 1000000)
    Wenn Du das Ergebnis berechnest, bevor Du die Validität der Werte überprüfst, wird Dir Dein Programm um die Ohren fliegen.
    Das Ergebnis berechnest Du im unteren Else-Zweig. ;)
    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!
    Hmm, hab versucht die ersten bemängelten Fehler zu beheben aber dann lief irgendwie gar nichts mehr.
    Also hab ich auf die MsgBox verzichtet und dafür ein Label eingefügt für die Fehlermeldung und so tut das Programm jetzt was es soll (auch wenn der Code wohl mies ist).

    Habe dann jetzt VisualStudio auf Strict umgestellt und werde mein zweites Programm dann hoffentlich ordentlich basteln.
    Bin ja froh das mir das hier gleich beim ersten Programm gesagt wurde :thumbup: .

    Hab mir mal das e-Book von dem Herrn Löffelmann VB 2010 runtergeladen, das scheint mir besser zu sein als die Sachen von Herr Theis von Galieo Press.
    So, zweiter Tag und zweites Programm!
    Diesmal soll es ein Produktionsrechner mit Wirkungsgrad werden.

    Der Wirkungsgrad sollte optional per CheckBox ausgewählt werden können.
    Habe jetzt auch das Strict on drin und irgendwie schimpft er jetzt rum weil bei der ElseIf Anweisung wohl etwas fehlt.

    Er erwartet einen "Ausdruck" und eine "End of Anweisung" aber wie das aussehen soll ?( .


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub cmdErrechnen_Click(sender As Object, e As EventArgs) Handles cmdErrechnen.Click
    3. Dim zykluszeit, formnestzahl, wirkungsgrad, tagesproduktion As Double
    4. zykluszeit = Convert.ToDouble(txtZykluszeit.Text)
    5. formnestzahl = Convert.ToDouble(txtFormnestzahl.Text)
    6. wirkungsgrad = Convert.ToDouble(cbWirkungsgrad.Text)
    7. If checkWirkungsgrad.Checked = True And cbWirkungsgrad.Text = "" Then
    8. MessageBox.Show("Bitte einen Wirkungsgrad auswählen!")
    9. ElseIf
    10. checkWirkungsgrad.Checked = True And cbWirkungsgrad.Text = > "50" Then
    11. tagesproduktion = 24 * 3600 * formnestzahl / zykluszeit / 100 * wirkungsgrad
    12. Else
    13. tagesproduktion = 24 * 3600 * formnestzahl / zykluszeit
    14. End If
    15. lblTagesproduktion.Text = CStr(Math.Round(tagesproduktion))
    16. End Sub
    17. End Class
    Dein ElseIf hat keine Anweisung
    Das fehler sowas wie "Wirkungsgrad.Checke = True" Oder Text <>""

    Quasi wie beim IF benötigt auch das ElseIf eine Anweisung Wann es ausgeführt werden soll.

    Du Schreibst
    Wenn das passiert (if)
    oder das passiert (else if)
    sonst (else)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    etwas gehübscht:

    VB.NET-Quellcode

    1. Private Sub cmdErrechnen_Click(sender As Object, e As EventArgs) Handles cmdErrechnen.Click
    2. Dim zykluszeit = Double.Parse(txtZykluszeit.Text)
    3. Dim formnestzahl = Double.Parse(txtFormnestzahl.Text)
    4. Dim wirkungsgrad = Double.Parse(cbWirkungsgrad.Text)
    5. If checkWirkungsgrad.Checked AndAlso cbWirkungsgrad.Text = "" Then
    6. MessageBox.Show("Bitte einen Wirkungsgrad auswählen!")
    7. ElseIf checkWirkungsgrad.Checked AndAlso cbWirkungsgrad.Text >= "50" Then
    8. tagesproduktion = 24 * 3600 * formnestzahl / zykluszeit / 100 * wirkungsgrad
    9. Else
    10. tagesproduktion = 24 * 3600 * formnestzahl / zykluszeit
    11. End If
    12. lblTagesproduktion.Text = Math.Round(tagesproduktion).tostring
    13. End Sub
    Beachte:
    1. Convert ist nachgeordnet einzusetzen, weil ist auch nur ein Sammelsurium von Konverter-Funktionen - nicht wirklich objektorientiert. ObjektOrientiert ist Double.Parse - weil wenn du Double willst, dann lass Double parsen (dito Integer, Boolean, Date uvm.)
    2. Hiermit:ElseIf checkWirkungsgrad.Checked AndAlso cbWirkungsgrad.Text >= "50" Thenfällst du auf die Nase, denn das ist ein String-Vergleich.
      Bei Strings ist "9" größer als "50", daher - immer auf die Datentypen achten - wenn du Zahlen vergleichen willst, vergleiche Zahlen, nicht Strings.
      Bei Zahlen ist 50 größer als 9
    3. If checkWirkungsgrad.Checked = True ist doppelt gemoppelter Quatsch. Ein Boolean (.Checked) braucht man nicht mit True zu vergleichen, denn der ist bereits True oder False (sind Booleans immer!)
    4. And nie mehr für logische Vergleiche benutzen - nur noch als Bit-Operator (und soweit biste noch nicht). Nimm AndAlso wenn bei 2 Bedingungen zur ersten zusätzlich die 2. zutreffen muss.
    5. Gewöhn dir nicht an, allenthalben unnötige Leerzeilen reinzumachen. Eine Methode ist ein zusammenhängender Block, und das sollte sichtbar sein.
      Bei viel Code und vielen Methoden erschweren die optischen Lücken die Lesbarkeit.

    Bei der Combo kannst du wesentlich eleganter Databinding verwenden - dann kann auch garnet passieren, dass kein Wirkungsgrad angewählt ist. Auch das später, wenn Interesse.

    Dennis schrieb:

    So, zweiter Tag und zweites Programm!

    Mach doch bitte in Zukunft, unterschiedliche Problemstellungen, auch unterschiedliche Threads auf !
    Einfach mal mitten im Thread, das Thema zu wechseln ist etwas verwirrend und das muss doch nicht sein ! :S

    edit: Und markiere doch bitte noch diesen Thread als erledigt (das uhrsprüngliche Problem ist es ja),
    indem du oben auf das rote Quadrat klickst.

    Dennis schrieb:

    Herje, da wird man ja irre

    Ja, aber der Wahnsinn hat Methode und System.

    Ist am Anfang wie ein Chaos aufräumen, wenn man noch nicht weiß, wo die Sachen hinkommen.
    Anfangs kriegste jeden Handgriff verbessert, und erst mit der Zeit kriegste mit, wie durchdacht die Ordnung des Systems ist, wie schnell man was findet, und wie effizient man damit arbeiten kann.
    Ja, wirklich toll das es Leute wie dich gibt, welche die Geduld aufbringen, auf soviel "nervige" Fragen zu antworten!

    Im Moment kann ich mir beim besten Willen noch nicht vorstellen da jemals auch nur den Hauch von Durchblick zu haben aber es macht trotzdem schon sehr viel Spaß.
    Habe mir gerade ein Webradio per Youtube-Tutorial gebaut und das läuft super!

    Eine Konsolenanwendung mit Desktopverknüpfung um meinen Rechner herunterzufahren nenne ich mittlerweile auch mein eigen
    (wobei ich da noch nicht sicher bin ob das gesund für den Rechner ist) :D .

    Für 2 Tage reinschnuppern macht das schon richtig viel Spaß, trotz absoluter Planlosigkeit!