Do...Loop Problem



  • Hallo, ich habe ein Problem bei meiner Do Loop Schleife.

    Ich möchte so lange eine Rechnung durchführen lassen, bis man bei einer erscheinenden MessageBox No wählt. Bei No wird das Programm verlassen, dies funktioniert, aber bei Yes schliesst sich die MessageBox nicht mehr, so dass ich nicht mehr zum Eingabefenster komme. Unten ein grober Programmausschnitt.

    Dim weitermachen As Integer
    Do
    .
    .
    .

    weitermachen = MessageBox.Show("Möchten Sie eine weitere Rechnung tätigen", "Weitere Rechnung",
    MessageBoxButtons.YesNo)

    Loop While weitermachen = Windows.Forms.DialogResult.Yes



  • Kann man denn unter VB einem Integer ein Windows.Forms.DialogResult zuweisen?



  • Matzi schrieb:

    aber bei Yes schliesst sich die MessageBox nicht mehr

    Es ist vermutlich nicht so, dass sich die MessageBox nicht mehr schließt, sondern so, dass du sie immer wieder aufrufst, weil deine Abbruchbedingung der Schleife nicht erfüllt wird. Das kannst du überprüfen, indem du mal schrittweise mit dem Debugger durch den Code gehst (setze dir einen Haltepunkt auf die Zeile mit der MessageBox). Die Lösung dürfte sein, den richtigen Typ für weitermachen zu verwenden.



  • David W schrieb:

    Kann man denn unter VB einem Integer ein Windows.Forms.DialogResult zuweisen?

    Hab das so einem Buch entnommen.



  • Matzi schrieb:

    David W schrieb:

    Kann man denn unter VB einem Integer ein Windows.Forms.DialogResult zuweisen?

    Hab das so einem Buch entnommen.

    klar is enum



  • Ähm, habe gerade noch mal einen Blick auf deinen Code riskiert. Deine Abbruchbedingung ist doch "solange bei der MessageBox Yes gewählt wird, wiederhole die Schleife, in der die MessageBox aufgerufen wird"! Ist doch logisch, dass die Box immer wiederkehrt, wenn du Yes drückst. Du solltest dir mal Gedanken machen, wann du die Schleife wirklich verlassen willst.



  • _matze schrieb:

    Ähm, habe gerade noch mal einen Blick auf deinen Code riskiert. Deine Abbruchbedingung ist doch "solange bei der MessageBox Yes gewählt wird, wiederhole die Schleife, in der die MessageBox aufgerufen wird"! Ist doch logisch, dass die Box immer wiederkehrt, wenn du Yes drückst. Du solltest dir mal Gedanken machen, wann du die Schleife wirklich verlassen willst.

    Wenn ich doch Yes drücke, dann müsste doch wieder an den Anfang der Schleife, also direkt hinter Do gesprungen werden. Oder gibt es vielleicht einen eigenen Befehl der mir die MessageBox wieder schliesst. Ich bin da ja noch absoluter Anfänger.



  • In deinem Code oben ist eben nur die Dialogbox drin. Was steht denn alles in dieser Schleife?



  • Matzi schrieb:

    _matze schrieb:

    Ähm, habe gerade noch mal einen Blick auf deinen Code riskiert. Deine Abbruchbedingung ist doch "solange bei der MessageBox Yes gewählt wird, wiederhole die Schleife, in der die MessageBox aufgerufen wird"! Ist doch logisch, dass die Box immer wiederkehrt, wenn du Yes drückst. Du solltest dir mal Gedanken machen, wann du die Schleife wirklich verlassen willst.

    Wenn ich doch Yes drücke, dann müsste doch wieder an den Anfang der Schleife, also direkt hinter Do gesprungen werden. Oder gibt es vielleicht einen eigenen Befehl der mir die MessageBox wieder schliesst. Ich bin da ja noch absoluter Anfänger.

    Die MessageBox schliesst sich, nur machst du danach sofort eine neue auf.
    Es sieht also vermutlich nur so aus als ob sich die MessageBox nicht schliesst.

    Was hättest du denn erwartet dass passiert?



  • PRIEST schrieb:

    In deinem Code oben ist eben nur die Dialogbox drin. Was steht denn alles in dieser Schleife?

    Hier ist der komplette Code

    Public Class Form1

    Private Sub BtnBerechnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBerechnen.Click

    Dim weitermachen As Integer 'Variable zum weiter Rechnen

    Do

    'Variablen deklarieren
    Dim zahl1, zahl2 As Double
    Dim operatorsymbol As Char

    'Werte einlesen
    zahl1 = TxtZahl1.Text
    operatorsymbol = TxtOperatorsymbol.Text
    zahl2 = TxtZahl2.Text

    'Rechenoperationen
    Select Case operatorsymbol

    Case "+"
    TxtErgebnis.Text = zahl1 + zahl2
    Case "-"
    TxtErgebnis.Text = zahl1 - zahl2
    Case "*"
    TxtErgebnis.Text = zahl1 * zahl2
    Case "/"
    If zahl2 <> 0 Then
    Dim antwort As Integer 'Rückgabewert der Ganzzahldivisionsabfrage
    antwort = MessageBox.Show("Möchten Sie eine Ganzzahldivision durchführen", "Ganzzahldivision",
    MessageBoxButtons.YesNo)
    If antwort = Windows.Forms.DialogResult.Yes Then
    TxtErgebnis.Text = (CInt(zahl1) / CInt(zahl2)).ToString + " " + "Rest" + " " + (zahl1 Mod zahl2).ToString
    Else
    TxtErgebnis.Text = zahl1 / zahl2
    End If
    Else
    MsgBox("Die Division durch Null ist nicht erlaubt!!")
    End If
    Case "Mod"
    TxtErgebnis.Text = zahl1 Mod zahl2

    Case Else
    MsgBox("Ihre Eingabe war nicht korrekt")

    End Select

    'Abfrage zum weiter Rechnen
    weitermachen = MessageBox.Show("Möchten Sie eine weitere Rechnung tätigen", "Weitere Rechnung",
    MessageBoxButtons.YesNo)

    Loop While weitermachen = Windows.Forms.DialogResult.Yes

    MsgBox("Danke für die Benutzung meines Taschenrechners")

    End Sub
    End Class

    Ich habe gedacht, wenn ich Yes drücke dann wird wieder an den Anfang der Schleife gesprungen und ich kann wieder neue Werte einlesen.
    Wenn oben im Programm die MessageBox aufgeht, wo gefragt wird ob man eine Ganzzahldivision durchführen möchte und man klickt auf Yes, dann geht die MessageBox auch zu.



  • Hallo Matzi,

    dein Problem heißt: Warum blockiert meine GUI, s. z.B. http://www.mycsharp.de/wbb2/thread.php?threadid=27992 (ist zwar für C#, gilt aber auch für VB.NET).

    Du scheinst die ereignisorientierte Programmierung bei WinForms noch nicht verstanden zu haben (ich nehme an, vorher hattest du ein Konsolenprogramm - und dort funktioniert es).

    Du darfst nicht einfach eine Warte- bzw, Endlosschleife innerhalb einer Ereignismethode programmieren, da du damit die gesamte GUI zum Stillstand bringt ("Die Anwendung reagiert nicht mehr.").

    Du darfst allenfalls eine if-Anweisung nach deinem MessageBox-Aufruf durchführen:

    if weitermachen = Windows.Forms.DialogResult.No then
      Close();
    end if;
    

    Der User deines Programms muß ja die Möglichkeit bekommen wieder neue Werte bei den TextBoxen einzugeben (ansonsten würden sich in deiner Schleife die TextBox-Inhalte nicht ändern).


Anmelden zum Antworten