■94979 / inTopicNo.1) |
ImageListのImage.Dispose |
□投稿者/ OA (5回)-(2020/06/08(Mon) 19:01:10)
|
分類:[VB.NET/VB2005 以降]
環境:VB2019、.Net4.7.2、Windowsフォームアプリケーション
ListViewにImageListをセットして、フォルダ内の画像をサムネイルにして表示させています。
対象フォルダを変更した場合、ImageList内のImageを動的に追加、削除しているのですが、
ImageList内のImage.Disposeに関してわからないので、教えてください。
●(質問1)
現在は、破棄用のフィールド変数を用意して、ImageListにAddする時に破棄用のフィールド変数
にも同じImageをAddして以下のようにコーディングしています。
でも★1でFalseと判定され、ResetImageListでDisposeしているImageはImageList内のImageと
別の参照と判定されます。
これだとResetImageList内でImageListのImageをDisposeできていなのか?と思い質問しました。
この認識が正しいなら、ちゃんとDisposeするには、どうすればよいか教えてください。
●(質問2)
https://stackoverflow.com/questions/9515759/disposing-an-imagelist
の一番最後の所に「ImageListは、イメージを追加すると、元のイメージではなくコピーを追加する」
みたいなことが書いてあるので、★★2の箇所でオリジナル画像をDisposeしているのですが、
この認識は正しいですか?
●(質問3)
どこかのサイトでコントロールを動的に追加削除する場合(今回はコントロールではありませんが)
はClearしてからDisposeとあったので、以来そのようにコーディングしていますが、
どうせ破棄するものを、一旦変数に退避しているので、無駄にメモリを使っているようにも
思うのですがどうなんでしょう?
ローカル変数にせずに、フィールド変数としているのはResetImageList内でローカル変数として
宣言するよりAddの時の方が速度面で有利と思ったからです。
Private Images As New List(Of Image)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ResetImageList()
For Each file In IO.Directory.GetFiles("C:\Test1", "*.jpg")
Dim img = Image.FromFile(file)
ImageList1.Images.Add(img)
Images.Add(ImageList1.Images(ImageList1.Images.Count - 1))
Debug.WriteLine(ImageList1.Images(ImageList1.Images.Count - 1).Equals(Images(Images.Count - 1))) '★1
img.Dispose() '★★2
Next
End Sub
Private Sub ResetImageList()
ImageList1.Images.Clear()
For Each img In Images
img.Dispose()
Next
Images.Clear()
End Sub
|
|