Zweites Form und dessen PictureBox löschen (oder nicht?)

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Zweites Form und dessen PictureBox löschen (oder nicht?)

    Hallo liebes Forum,

    ich habe ein neues Testprojekt erstellt, in dem ich ein zweites Form und darauf eine PictureBox erstelle. Trotz

    Quellcode

    1. .Dispose()
    warnt mich VisualStudio, dass die beiden nie gelöscht werden. Bei den Diagnosetools sieht es auch so aus.

    Ich will erst das zweite Form löschen, wenn der dazugehörige Button2 gedrückt wird. Mit Using / End Using verschwindet ja alles wieder sofort. Und ich will die Sub nicht lang aufhalten...
    Als Button2 gedrückt wurde und der Befehl

    Quellcode

    1. GC.Collect()
    kam, sieht man an der gelben Markierung in den Diagnosetools, dass nichts passiert.

    Was kann ich tun?

    VB.NET-Quellcode

    1. Public NotInheritable Class Form1
    2. Private ReadOnly Screens As Screen() = Screen.AllScreens
    3. Private ReadOnly PBox2BS As New PictureBox()
    4. Private ReadOnly Form2 As New Form
    5. Private HasBeenDisposed As Boolean = False
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.BackColor = Color.FromArgb(50, 168, 82)
    8. Button1.BackColor = Color.FromArgb(181, 255, 120)
    9. Button1.Text = $"prüfen, ob Bildschirm 2 da ist und zweites Form erstellen"
    10. Button2.BackColor = Color.FromArgb(255, 168, 61) 'Hellorange
    11. Button2.Text = $"Form2 und PictureBox entfernen"
    12. Button2.Enabled = False 'damit man nicht Form2 aus Versehen zu früh disposet
    13. End Sub
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. If Screens.Count = 2 Then
    16. Initialize_new_Form_and_PictureBox()
    17. Button2.Enabled = True
    18. Else
    19. Exit Sub
    20. End If
    21. End Sub
    22. Private Sub Initialize_new_Form_and_PictureBox()
    23. If HasBeenDisposed Then
    24. Exit Sub
    25. End If
    26. Form2.Show()
    27. Form2.BackColor = Color.FromArgb(158, 244, 255)
    28. Form2.FormBorderStyle = FormBorderStyle.None
    29. Form2.Location = New Point(Screens(1).Bounds.X, Screens(1).Bounds.Y)
    30. Form2.Size = New Size(Screens(1).Bounds.Width, Screens(1).Bounds.Height)
    31. Form2.Controls.Add(PBox2BS)
    32. PBox2BS.Location = New Point(0, 0)
    33. PBox2BS.Size = New System.Drawing.Size(Screens(1).Bounds.Width, Screens(1).Bounds.Height)
    34. PBox2BS.Visible = True
    35. PBox2BS.BackColor = Color.Black
    36. PBox2BS.BorderStyle = BorderStyle.None
    37. PBox2BS.SizeMode = PictureBoxSizeMode.StretchImage
    38. PBox2BS.Image = New Bitmap("C:\Users\meinPfad.png")
    39. End Sub
    40. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    41. PBox2BS.Dispose()
    42. Form2.Dispose()
    43. HasBeenDisposed = True
    44. GC.Collect()
    45. End Sub
    46. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    47. PBox2BS.Dispose()
    48. Form2.Dispose()
    49. End Sub
    50. End Class
    Bilder
    • BS2 vb-paradise - Kopie.jpg

      49,81 kB, 767×275, 65 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Wie genau erhältst Du die Warnung? Ist das mit dem FxCopAnalyzers-Plugin? Wenn es eine Warnung ist, dann ist das erstmal nur ein Hinweis. Klar, besser ist es, alle Warnungen zu beseitigen. Das Problem ist, dass m.E. der Analyzer nicht davon ausgehen kann, dass ein EventHandler (FormClosing) auch wirklich aufgerufen wird. Daher wird das Teil wohl meckern.
    @Bartosz: Um das zu beheben, müsstest Du schon in der FormX.Designer.VB in der Sub Protected Overrides Sub Dispose(ByVal disposing As Boolean)die beiden Kandidaten disposen. So klappt es zumindest bei mir mit dem FxCopAnalyzer.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Direkt von Visual Studio
    Bilder
    • Screenshot2 - Kopie.jpg

      55,88 kB, 665×199, 70 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Ich bekomm die Anzeige leider nicht hin bzw mein VS2019CE bleibt brav. Aber wie oben gefragt: klappt es, wenn Du in der Dispose-Sub die beiden disposed?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Danke soweit. Ich weiß leider nicht, was du meinst :( Wie rufe ich diese Sub auf? Wo finde ich die?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Wenn Du im Code-Designer mittig oben auf die ComboBox klickst und da auf Form1 und danach rechts in der nächsten ComboBox auf Dispose, dann kommst Du in dem Fenster raus, welches ich ebenfalls rot markiert habe. Da kannst Du Deine Dispose-Anweisungen reinschreiben. Bei Dir dürfte die Codedatei etwas anders/umfangreicher aussehen.
    Bilder
    • Dispose.png

      50,24 kB, 1.385×539, 74 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jetzt, nach dem Dareinschreiben, kann nicht mehr auf die Debug-Datei zugegriffen werden. Kaspersky mochte das nicht, angeblich Trojaner in diesem Programm hahahahah :thumbdown:


    Neues Erstellen bringt auch nix.

    Also wieder gelöscht.

    Programm läuft wieder, aber mit den Warnungen. Alles auf Anfang.
    Bilder
    • fehler - Kopie.jpg

      55,74 kB, 838×154, 60 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Argh, diese Virenscanner :cursing:
    Das eigene Programm auf die Whitelist zu setzen, ist auch ne Sisyphosarbeit. Stellt sich wieder mal die Frage, ob man sich dank Win10-Scanner nen extra Virenscanner ersparen könnte. Aber das ist off-topic.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Ja echt xD aber gut, ich hab's bis jetzt so verstanden, dass ich mir trotz der Warnung "Wird niemals gelöscht" keine Gedanken machen muss?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Da Du weißt, dass es aufgeräumt wird, weil Du es im richtigen EventHandler hast, ist alles gut. Die Warnung kannst Du ignorieren oder eben alternativ den VS-Code-Analyzer durch Verlagerung des Form/PicBox-Disposings in die Dispose-Sub besänftigen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Bartosz schrieb:

    VB.NET-Quellcode

    1. Form2.Show()
    Fang an und programmiere in VB.NET, nicht aber in VB6.
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Und:
    Pack mal das .Dispose() in das Dispose() der Form in der Datei FormX.Designer.vb.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    @RodFromGermany: Das läuft ins Leere, siehe Post#1, Zeile#4. Das andere hatten wir schon in Post#2.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nachfrage:
    Mir wird kein Form2.IsDisposed angeboten. .IsDisposed verwendet @RodFromGermany in seinem Tut, Post #1. Ich hab's gestern auch gesucht, aber wie gesagt, bei IntelliSense kommt nichts und ich musste eine globale Boolean zum Testen hernehmen.
    Bilder
    • vb paradise kein IsDisposed - Kopie.jpg

      70,38 kB, 622×370, 50 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @ErfinderDesRades Danke, dieser Code klappt. Bin der Meinung, gestern gab's nen Fehler aber mir ging's auch nicht gut.

    VB.NET-Quellcode

    1. If Form2.IsDisposed OrElse Form2 Is Nothing Then
    2. Exit Sub
    3. End If
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @VaporiZed Nicht ganz.

    Bartosz schrieb:

    Mir wird kein Form2.IsDisposed angeboten.
    Du verwendest die Sch... Mist Ranz VB6-Kompatibilitäts-Instanz einer Form!
    Fang an mit dem richtigen Instanziieren Deiner Form2 :!:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades
    Ok, Bedingung mit Nothing ist raus
    Wie würdest du es benamen?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.