Děkuji, de facto mi popisujete chování tak, jak jsem si jej alespoň rámcově představoval. jenomže to mi právě nějak nesedí, přesněji veškeré mé teoretické znalosti (nebo alespoň představy o tom, že již něco vím) berou za své: 1) Bylo nám vysvětlováno, že proměnná deklarovaná na úrovni modulu má platnost pouze v rámci tohoto modulu, tedy v kódu
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim im As Bitmap
im = Bitmap.FromFile("c:\obr.jpg")
img = im.Clone()
im.Dispose()
End Sub
je im deklarováno přesně dle výše uvedeného, to dispose jsem tam dal dle rady kolegy Rennera, ale žil jsem v domnění, že by tam být ani nemuselo, že stejný účel by mělo splnit i ukončení definičního oboru proměnné, tedy metody, ve které byla deklarována. Leč chyba lávky, nechová se to tak... Evidentně je zakopán pes v té metodě Clone, protože pokud tam tato není a s im manipuluju pouze tak, že ji třeba uložím na disk pod novým názvem souboru (viz příklad, který pan Renner navrhl jako poslední), pak to vše fubguje OK a soubor se odemkne. S tou libovůlí při implementaci metody Clone jste mne tak trochu zaskočil, protože kde pak člověk má zjistit, jak to vlastně funguje, když v manuálu metody je napsáno pouze, že "Creates an exact copy of this System.Drawing.Image". A krom toho jsem doposud žil v bláhových představách, že přiřazení může být realizováno hodnotou (do zcela nezávislého nového objektu) nebo odkazem (ukazuje na stejný objekt). No a pokud si metodu upravím:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim im As Bitmap
im = Bitmap.FromFile("c:\obr.jpg")
img = im.Clone()
im.Dispose()
im = Nothing
Me.PictureBox1.Image = img
End Sub
pak i když po vytvoření "klonu" proměnné im do proměnné img proměnnou im "disposnu" a pro jistotu ještě nastavím na nothing, tak mi v proměnné img vše zůstane nedotčeno a zobrazí se mi do pictureboxu. Ještě donedávna bych tedy byl přesvědčen, že se skutečně vytvořila kopie obrázku a ne odkaz na obrázek původní. Přitom soubor na disku stále zůstává uzamčen jakékoliv manipulaci!? Teď jsem ještě zkusil přidat do metody (místo toho zobrazení v pictureboxu)
img.dispose()
a okamžitě se mi soubor na disku uvolnil. Tam skutečně zůstává nějaká reference, ale proč (když objekt "bitmap" nemá se souborem ze kterého byl načten snad už nic společného, takže selským rozumem by se měl ten soubor "odpojit" samovolně okamžitě po načtení), to mi zůstává záhadou. A ještě větší záhadou pro mne je, jak takové chování odhalit jinak, než "neprogramátorsky" metodou pokus-omyl?
|