Laden...

ListView mit PictureBox - Deallokierungsproblem

Erstellt von sven22 vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.258 Views
S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren
ListView mit PictureBox - Deallokierungsproblem

Ich habe eine ListView mit thumbnail items. Der User klickt auf ein solches und das dahinter liegende Bild wird in einer PictureBox einer neuen Form dargestellt. Nun klickt der User in der PictureBox-Ansicht auf löschen. Das Bild der Picturebox gebe ich mit

myPictureBox.Image.Dispose();
myPictureBox.Image = null;

frei. Leider reicht dies nicht. Ich bekomme immer noch die Meldung das ein anderer Prozess die Datei benutzt. Wenn ich nun in meiner ListView auf das angeklickte Item ein

lvItem.Focus=false;
lvItem.Selected=false;

absetze funktioniert es in 80% der Fälle. Jedoch kann es das doch nicht sein? Eigentlich hat die ListView nix mit der Pictureboxform am Hut. Das Item selbst hält im Tag ein reines Informationsobjekt über das Bild, welches nicht an die Datei selbst gebunden ist.

Jetzt kommt der Klu: Mache ich die gleiche Operation (also löschen) auf das selektierte Item in der Listview läuft alles super. Das bedeutet warscheinlich, dass das Bild in meiner Picturebox nicht richtig deallokiert wird und durch meine "focus-Aktion" etwas mehr Zeit bekommt dies auch zu tun. Wie kann ich wirklich sicherstellen, dass mein Bild freigegeben wird BEVOR ich zum Löschen ansetze?

379 Beiträge seit 2004
vor 18 Jahren

Ich weiß ja nicht wie du dein Bild in die PictureBox lädst, aber ich hatte auch mal ein ähnliches Problem... Wenn du das Bild direkt über den Pfad lädst, dann mache es bitte mal so:


Image img = Image.FromFile("C:\bild.bmp");

Bitmap bmp = new Bitmap(img);

img.Dispose;

// Jetzt kannst du das bmp an deine PicturBox binden
myPictureBox.Image = bmp;

Habe das jetzt aus dem Kopf geschrieben, aber es müßte so glaube ich korrekt sein 😉

ciao Anke

S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

Hi danke für den Tipp,

leider es ist etwas komplizierter:

Ich erzeuge ein Bild, welches genau in das Fenster passt. Wenn nötig
wird halt geschrumpft ansonsten wird es so belassen. Hier liegt der Hase
im Pfeffer: Wenn ich es schrumpfe ist alles super aber irgendwie
geht wohl folgendes nicht:

...
resultImage = (Image)fullImage.Clone();
fullImage.Dispose();
fullImage = null;
...
//pbox füllen
meinePictureBox.Image=resultImage;
...
//löschen
meinePictureBox.Image.Dispose();
meinePictureBox.Image=null;
resultImage.Dispose();
resultImage=null;

//boing fehler:
File.Delete(meinFile);

Beim schrumpfen wird das bild in ein neues Bild gemalt und das alte disposed. Jedoch sollte mein code doch auch bewirken, dass das Original sich in verflüchtigt auch wenn es wie hier nicht geschrumpft wird? 🤔

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo sven22,

hast du denn schon mal den Code


resultImage = (Image)fullImage.Clone();
fullImage.Dispose();
fullImage = null;

durch den Code von hurricane ersetzt?

herbivore

S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

Ja, gleiches Problem.

Edit:
Das einzige was mein Problem wirklich behebt ist:


ThumbMaker tm = new Thumbmaker(inPath2Image);
resultImage = tm.GetThumbnailImage(x,y);

wobei in GethumbnailImage eine neue Bitmap generiert und die alte
reingezeichnet wird. Die alte wird dann einfach gelöscht. Wobei
das dort lustigerweise funktioniert.