PictureBox1.Image.Dispose() Baut bei mir mist :(

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    PictureBox1.Image.Dispose() Baut bei mir mist :(

    VB 2013
    Sory Rechtschreibung ist lausig ^LB-S..ich weiß nicht was Tags ist in forum ist, hoffe das es richtig ist ?

    Das Visitenkarten-programm ist zu 80 % fertig,, dachte ich finde den Fehler später aber mmm.....

    Das 1te Problem

    Ich habe ein Problemm Dispose löscht auch Dim und alles mit was es verbunden ist :(
    Gibt es nicht anderes außer PictureBox1.Image.Dispose() ?
    Ich muss Arbeitsspeicher Sparen. :( .. Habe schon 4 Stunden gegoogelt
    Und bücher durchgesehen nichts gefunden.

    Erstmal was super gehen tut.

    VB.NET-Quellcode

    1. Dim Bildersave(20) As Bitmap
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Bildersave(0) = Image.FromFile(".\visitenkarten1.png")
    4. Bildersave(1) = Image.FromFile(".\visitenkarten2.png")
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Try
    8. PictureBox1.Image = Bildersave(0)
    9. Catch ex As Exception
    10. PictureBox2.Image = Bildersave(0)
    11. End Try
    12. PictureBox3.Image = Bildersave(1)
    13. End Sub
    14. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    15. PictureBox1.Image.Dispose()
    16. End Sub



    1 Wenn ich Knopf 1 drücke kommt das Bild in PictureBox1. OK
    2 Wenn ich jetzt Knopf 2 drücke löscht sich das Bild aus PictureBox1. OK
    Jetzt der Fehler..
    3 Wenn ich jetzt nochmal Knopf 1 drücke sagt er . <--- Fail

    PictureBox1.Image = Bildersave(0) <----- Zusätzliche Informationen: Ungültiger Parameter.
    PictureBox2.Image = Bildersave (0) <-- geht auch nicht
    PictureBox3.Image ist OK

    PictureBox1.Image ladet kein bild mehr rein
    Bildersave(0) ist lehr ,,, sollte so nicht sein das kapiere ich nicht.

    ---------------------------------
    Das 2te Problem

    VB.NET-Quellcode

    1. Dim Bildersave As Bitmap
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Bildersave = Image.FromFile(".\Landkarte.png")
    4. PictureBox1.Image = Bildersave
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Try
    8. Dim i As Image = Bildersave
    9. Dim g As Graphics = Graphics.FromImage(i)
    10. Dim s As String = "Hallo"
    11. g.DrawString(s, New Font("Arial", 20), Brushes.Blue, New PointF(0, 0))
    12. g.Dispose()
    13. Me.PictureBox2.Image = i
    14. PictureBox1.Image = Bildersave
    15. Catch ex As Exception
    16. End Try
    17. End Sub


    Hallo steht in PictureBox2.Image ok,,,aber jetzt auch in PictureBox1.Image Warum das den ?
    Warum ist Bildersave auch geändert wurde ich weiß nicht weiter........

    Ich kann auch nen Youtupe video machen damit mann es besser zeigen kann.

    Ich suche nur den Fehler .^^


    Edit by hal2000: Code-Tags eingefügt

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

    Wenn du erreichen willst das die Picturebox wieder leer ist würde mir spontan nur einfallen:

    VB.NET-Quellcode

    1. Picturebox.image = nothing

    ob das aber auch Arbeitsspeicher freigibt kann ich dir leider nicht sagen (wobei sich theoretisch der Garbagecollector darum kümmern sollte)

    Greets
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,

    erst ein Mal: Code bitte sauber formatieren.

    Nun zu deinen Problemen.
    Erstens:
    Das Schlüsselwort Dispose zerstört ein Objekt. Image ist ein sogenannter Referenztyp. Das bedeutet, dass wenn du bspw. der Variable foo vom Typen Image das Bild bar zuweist - also:

    VB.NET-Quellcode

    1. Dim foo As Image = bar
    -, dann wird in foo keine Kopie von bar gespeichert, sondern eine Referenz von ihm. Alles, was du nun mit foo anstellst, passiert mit bar und vice versa. Zerstörst du also nun PictureBox3.Image mit Dispose, dann wird auch logischerweise Bildersave(1) zerstört, denn sie zeigen beide auf den gleichen Speicherbereich.
    Wenn du mit dem Klick auf Button2 erreichen willst, dass das Bild verschwindet, aber faktisch geladen wird, weise der Property Image der PictureBox einfach Nothing zu. Damit bleibt das Bild zwar im Speicher, aber ist nicht mehr der PictureBox zugewiesen.

    Zweitens:
    Hier kommt das ganze auch wieder zum Tragen. i zeigt auf Bildersave. Wenn auf i gemalt wird, dann wird auch auf Bildersave gemalt.
    Die Lösung in diesem Falle wäre also eine Kopie von Bildersave zu erstellen. Das kostet dann aber doppelt Speicher, da zwei Instanzen gespeichert werden. Das Ganze funktioniert mit der Methode Image.Clone.

    Ich hoffe, ich konnte dir weiterhelfen.

    Grüße
    Myrax
    @Knopfab machst Du

    VB.NET-Quellcode

    1. If PictureBox1.Image IsNot Nothing Then
    2. PictureBox1.Image.Dispose()
    3. PictureBox1.Image = Nothing
    4. End If
    5. PictureBox1.Image = Bildersave(0)

    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!
    mein Senf:
    Dispose löscht auch Dim und alles mit was es verbunden ist
    Ist Unsinn, ein Dim kann man nicht löschen, und "verbundenes" gibts in diesem Zusammenhang auch nichts.
    Wichtiger Rat: benutze Fachbegriffe richtig.
    Du willst mit obigem irgendetwas sagen, aber das kann man einfach nicht verstehen, und so versteht jeder was anderes, und du u.U. haufenweise Antworten, und alle nicht richtig für dein Problem.
    Das ist kein Rechtschreib-Problem, sondern ein Problem der Begrifflichkeiten.

    Ansonste sehe ich glaub einige Fehler, aber dazu äusser ich mich erst, wenn du nochmal neu fragst, und mit ordentlich lesbarem Code.
    Klingt jetzt erpresserisch, aber ist in deim Interesse: Je besser dein Code lesbar ist, und je eindeutiger deine Problembeschreibung, desto bessere Antworten kriegst du.
    Oft findet man sogar die Antworten dann selbst, einfach nur, weil man sein Problem sorgfältig schildert (geht mir oft so).

    Achso - Hilfestellungen zu beiden Problemen:
    Grundlagen: Fachbegriffe