- ベストアンサー
Imagelistの使い回しについて
- 現在、ListviewとImagelistを使用して同じカテゴリの画像を表示させる方法を試しています。しかし、画像の読み込みに時間がかかります。そこで、Imagelistを使い回す方法を試していますがうまくいきません。
- 試した方法としては、初回はImagelistに画像を読み込みます。画像が多い場合は、配列を使ってそのコピーを作成し、次回以降はそのコピーを表示するようにしています。ただし、ImagelistのImagesをクリアすると、コピーも消えてしまいます。
- 色々試しましたが、Imagelistの使い回しにうまい方法が見つかりません。どなたか助けていただけると嬉しいです。VBは2008を使用しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
説明だけではうまく伝わらないこともありますので、 コードも載せていただけると助かります。 Dim MyImageList(3) As ImageList Dim Imagelist1 As New ImageList() '画像の読み込み With Imagelist1.Images .Add(Image.FromFile("test01.jpg")) .Add(Image.FromFile("test02.jpg")) .Add(Image.FromFile("test03.jpg")) '---(略)--- .Add(Image.FromFile("test20.jpg")) End With '画像が多い場合は配列に登録 If Imagelist1.Images.Count >= 20 Then MyImageList(0) = Imagelist1 End If いろいろと手抜きしていますが、こんな感じのコードでしょうか? .NETのすべての型は「値型」と「参照型」に分けられます。 Imagelist1.Images.Clear()という操作がMyImageList(index)にも影響した(という言い方は正確ではないですが……)のは ImageListという型が「参照型」だからです。 オブジェクトを思い通りに操作するには、 値型と参照型の違いをよく理解しておく必要があります。 この2つについて説明されているサイトのアドレスを貼っておきますので、 こちらの「変数への代入における値型と参照型の違い」という項目を参考になさってみてください。 http://dobon.net/vb/dotnet/beginner/valuereference.html
お礼
回答ありがとうございます。 なるほどImagelistとは、こういう仕組み?(参照型)だったのですね。これで無関係なMyImageListが消えるのも納得です・・・というか無関係でなかったと・・・ 参照型を理解した(多分)うえで、仕組みを変えてImagelist1は削除して、MyImageList(index)のみにして、画像を入れた後にMyImageList(index).Images.Countが30以上の場合はindexを1プラスして新たにMyImageList(index+1)を作成して次回はそれを使うというやり方にしてプラスされる前のindexの値とカテゴリーを紐付して何とか目的を達成できました。ありがとうございました。