Benutzer mit den meisten Antworten
Frage zur IDE (.ShowDialog() und Code anhalten)

Frage
-
Hallo.
Es hat mich schon in der VB6-IDE immer völlig wahnsinnig gemacht:
Sagen wir mal, ich habe 2 Forms. Bei einem Klick auf einen Knopf auf Form A wird Form B angezeigt:
Private sub FormAKnopfKlick
FormB.ShowDialog()
End sub
Wenn ich jetzt das Debugging anhalte, springt er zu FormB.ShowDialog() und macht mir da den grünen Pfeil hin.
Dabei möchte ich aber in FormB einen Code ändern. Also muss ich mir erst wieder das Codefenster von Form B hervorholen.
Okay, jetzt habe ich den Code geändert und will das Debugging weiter laufen lassen, also klicke ich den Play-Button.
Jetzt merke ich, dass ich doch nochmal was ändern muss und klicke wieder auf "Debugging pausieren".
Jetzt springt er wieder in die Codezeile "FormB.ShowDialog()", und ich muss mich erst wieder zum Codefenster von FormB wühlen.
Das ist so nervig, dass ich zeitweise einen DummyCode in meine Forms einbaue, z. B.
Public Sub SpringHierHin
'Tu nix
End Sub
Wenn ich eine Form modal aufrufe, sage ich:
FormB.SpringHierHin()
FormB.ShowDialog()
Wenn er mir dann beim Anhalten wieder zu FormB.ShowDialog() springt, dann klicke ich mit Rechts auf FormB.SpringHierHin und sage "Geh zu Definition".
Damit komme ich am schnellsten wieder zum Codefenster von FormB, aber das ist so eine unprofessionelle Lösung, dass ich fragen wollte, ob andere auch das Problem haben und ob sie eine bessere Lösung haben.
Danke.
Antworten
-
Hallo,
der Debugger bleibt natürlich beim ShowDialog() stehen, weil sich die Ausführung gerade dort nun mal befindet; wo sollte er auch sonst stehen belieben?
Wenn Du bei Debug-Break im FormB stehen möchest, dann musst Du das ShowDialog einfach dort aufrufen. Also in FormB eine Sub erstellen, wo ShowDialog aufgerufen wird und aus FormA rufst Du die Sub auf. Beispiel:
Public Class FormB
Public Sub Init()
Me.ShowDialog()
End Sub
End ClassPublic Class FormA
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As New FormB
f.Init()
End Sub
End Class
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Thorsten DörflerModerator Sonntag, 12. Juni 2011 09:19
-
Hallo,
der Debugger hat keine andere Möglichkeit als bei der ShowDialog Anweisung anzuhalten. ShowDialog führt die aktuelle Nachrichtenschleife aus, solange gerade kein anderer Code läuft. Da die Nachrichtenschleife nicht in Deinem Code implementiert ist, kann er nicht zur exakten aktuellen Anweisung springen (gelber Pfeil), sondern zeigt nur den aktuellen Aufruf.
Wenn Du Wert auf eine professionelle Lösung legst, solltest Du Dich mit Haltepunkten, Debug.Assert bzw. der Stop Anweisung auseinandersetzen. Damit kannst Du selber definieren, an welcher Stelle im Code der Debugger anhalten soll, so dass Du bspw. Änderungen vorhnehmen kannst. Haltepunkte stellen hier noch den sanftesten Eingriff dar, da sie nicht den ausgeführten Code beeinflussen und nur aktiv sind, wenn Deine Anwendung debuggt wird. Über das Kontextmenü eines Haltepunkst stehen Dir auch einige Optionen zur Verfügung, um den Debugger nur dann dort halten zu lassen, wenn bspw. bestimmte Bedingungen erfüllt sind. Defnierst Du Bedingungen, findest Du meist auch schneller den Grund, warum die von Dir implementierte Logik nicht so funktioniert, wie Du Dir das vielleicht vorgestellt hast.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort markiert Thorsten DörflerModerator Sonntag, 12. Juni 2011 09:19
Alle Antworten
-
Hallo,
der Debugger bleibt natürlich beim ShowDialog() stehen, weil sich die Ausführung gerade dort nun mal befindet; wo sollte er auch sonst stehen belieben?
Wenn Du bei Debug-Break im FormB stehen möchest, dann musst Du das ShowDialog einfach dort aufrufen. Also in FormB eine Sub erstellen, wo ShowDialog aufgerufen wird und aus FormA rufst Du die Sub auf. Beispiel:
Public Class FormB
Public Sub Init()
Me.ShowDialog()
End Sub
End ClassPublic Class FormA
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As New FormB
f.Init()
End Sub
End Class
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Thorsten DörflerModerator Sonntag, 12. Juni 2011 09:19
-
Hallo,
der Debugger hat keine andere Möglichkeit als bei der ShowDialog Anweisung anzuhalten. ShowDialog führt die aktuelle Nachrichtenschleife aus, solange gerade kein anderer Code läuft. Da die Nachrichtenschleife nicht in Deinem Code implementiert ist, kann er nicht zur exakten aktuellen Anweisung springen (gelber Pfeil), sondern zeigt nur den aktuellen Aufruf.
Wenn Du Wert auf eine professionelle Lösung legst, solltest Du Dich mit Haltepunkten, Debug.Assert bzw. der Stop Anweisung auseinandersetzen. Damit kannst Du selber definieren, an welcher Stelle im Code der Debugger anhalten soll, so dass Du bspw. Änderungen vorhnehmen kannst. Haltepunkte stellen hier noch den sanftesten Eingriff dar, da sie nicht den ausgeführten Code beeinflussen und nur aktiv sind, wenn Deine Anwendung debuggt wird. Über das Kontextmenü eines Haltepunkst stehen Dir auch einige Optionen zur Verfügung, um den Debugger nur dann dort halten zu lassen, wenn bspw. bestimmte Bedingungen erfüllt sind. Defnierst Du Bedingungen, findest Du meist auch schneller den Grund, warum die von Dir implementierte Logik nicht so funktioniert, wie Du Dir das vielleicht vorgestellt hast.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort markiert Thorsten DörflerModerator Sonntag, 12. Juni 2011 09:19
-
Hallo!
Danke für die Antworten.
Das mit dem .Init kann ich ja jetzt machen, wo ich mit .ShowDialog eh keine Möglichkeit mehr habe, einen Owner anzugeben.
Das mit den Haltepunkt und den Variablen dazu fand ich schon in VB6 nicht gut, bzw. war nicht bequem zu benutzen, ich schau mal, wie das jetzt in .NET ist.
Das einzige was ich bisher immer benutzt habe und gut mit auskam, war
If SuperHatGeklappt() Then
else
debug.assert false
end if
:-)
Liebe Grüße.
-
Hallo,
statt dem umständlichen If Then Ungetüm reicht auch Debug.Assert SuperHatGeklappt. :-)
Die ShowDialog Methode(n) kannst Du auch überschatten. Halte ich auf für empfehlenswerter, da "Init" doch eher mit Initialisierungen assoziiert wird und man ggf. überrascht ist, wenn dabei schon der Dialog in Erscheinung tritt.
Public Shadows Function ShowDialog() As System.Windows.Forms.DialogResult Return MyBase.ShowDialog() End Sub Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As System.Windows.Forms.DialogResult Return MyBase.ShowDialog(owner) End Sub
Was die Arbeit mit Haltepunkten betrifft, darfst Du hier wirklich nicht auf Deine Erfahrungen mit VB6 zurückgreifen. In 13 Jahren, die seit VB6 vergangen sind, hat sich viel getan. Haltepunkte werden beim Schließen des Projekts gespeichert und es gibt komfortable Funktionen Haltepunkte auf einen Schlag zu aktivieren bzw. zu deaktivieren, neben bereits genannten Möglichkeiten Bedingungen zu definieren, wann der Debugger an einem Haltepunkt halten soll.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de