Toggle Window

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Toggle Window

    Hi,

    ich starte eine Anwendung mit der FormA.

    Mit einem Klick auf Button1 in FormA starte ich nicht modal eine zweite Form, nennen wir sie frmZoom.

    Wenn ich den Button1 erneut klicke, dann soll die frmZoom geschlossen werden. Und bei nächsten Klick, soll sie wieder geöffnet werden, usw. ... die Form soll also "toggeln".

    Eigentlich eine ganz einfache Sache, sollte man meinen. Trotzdem komme ich damit nicht zurecht. So habe ich das versucht:

    Ein einem Module1 definiere ich

    VB.NET-Quellcode

    1. Module Module1
    2. Public f As New frmZoom


    In der Button1_Click Prozedur hab ich nun folgendes kodiert:

    VB.NET-Quellcode

    1. 'Display zoom window
    2. If Not f.Visible Then
    3. f.Show()
    4. Else
    5. f.Close()
    6. End If


    Beim ersten Klick auf Button1 wird f angezeigt.

    Beim zweiten Klick auf Button1 wird f geschlossen.

    Soweit so gut.

    Beim dritten Klick auf Button1 erhalte ich einen Fehler: Cannot access a disposed object.

    Klar, der Close hat f weggeworfen ... und jetzt gibt es f nicht mehr. Nur wo und wie kriege ich das Dingens denn wieder her?

    Wie mache ich das also richtig ?

    LG
    Peter
    Jau ... das ist natürlich eine Umgehung, die mir eigentlich auch schon eingefallen ist.

    VB.NET-Quellcode

    1. 'Display zoom window
    2. If Not f.Visible Then
    3. f.Show()
    4. Else
    5. f.Hide()
    6. End If


    Allerdings kann f auch etwa durch Klick auf das rote "X" geschlossen werden. Und dann kracht der nächste Klick auf Button1 !

    Natürlich kann ich das Schließen von f abfangen und in der Closing Routine f "verstecken" und e-Cancel auf "True" setzen. Aber spätestens jetzt wird die Lösung haarsträubend!

    Ich möchte mein Problem halt nicht umgehen wollen, sondern "sauber" lösen - um zu verstehen, wie so etwas prinzipiell gelöst werden kann. Das sollte doch eigentlich möglich sein.

    LG
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Guten Morgen @Peter329

    Es ist nicht so das es nicht funktioniert. Eine nicht modale Form/Dialog sollte auch problemlos geschlossen werden können.

    Erstelle eine Sub in deiner frmZoom ähnlich dieser:

    VB.NET-Quellcode

    1. Friend Sub closeFrm()
    2. Me.Close()
    3. End Sub


    Ich habe auch schon die Erfahrung gemacht, dass es nicht funktioniert hat, weil komplexe Objekte in der zweiten Form noch nicht richtig zurückgesetzt wurden. Das müssten natürlich in der oberen Sub entsprechend vorher gemacht werden.

    Je nach dem kann es auch sein das deine closeFrm Public sein muss.


    Freundliche Grüsse

    exc-jdbi
    Will man die zweite Form öffnen, muss sie immer vorweg neu instanziert werden. Das ist auch nach dem schliessen der zweiten Form so.
    Wird die zweite Form geschlossen müssen alle komplexe Objekte (z.B. zugriff auf eine DB oder ähnliches usw.) korrekt geschlossen sein. nur dann kann die zweite Form auch korrekt geschlossen werden. D.H. also auch das bei der Instanzierung zum öffnen der zweiten Form die komplexen Objekte neu instanziert werden müssen, sofern sie nicht unabhängig sind.

    Ich hatte gerade vor Kurzem ein solches Beispiel hat bestens geklappt.

    Freundliche Grüsse

    exc-jdbi
    Nach euren Hinweisen (vor allem hinsichtlich der Instanzierung) hab ich das jetzt wie folgt gelöst:

    VB.NET-Quellcode

    1. 'Recrreate from if it does not exist or if it is disposed
    2. If f Is Nothing OrElse f.IsDisposed Then f = New frmZoom
    3. If Not f.Visible Then
    4. 'Display zoom window
    5. f.Show()
    6. Else
    7. 'Close zoom window
    8. f.Close()
    9. End If


    Das klappt jetzt prima !

    Danke für eure Ratschläge ... Problem gelöst, Daumen hoch!

    LG
    Peter