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 operatorsymbolCase "+"
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 zahl2Case 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 ClassIch 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).