none
Frage zur IDE (.ShowDialog() und Code anhalten) RRS feed

  • 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.


    Freitag, 27. Mai 2011 06:42

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 Class

    Public Class FormA
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles 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
    Freitag, 27. Mai 2011 07:01
  • 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
    Freitag, 27. Mai 2011 07:20
    Moderator

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 Class

    Public Class FormA
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles 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
    Freitag, 27. Mai 2011 07:01
  • 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
    Freitag, 27. Mai 2011 07:20
    Moderator
  • 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.

     

    Freitag, 27. Mai 2011 09:23
  • 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
    Freitag, 27. Mai 2011 10:20
    Moderator