プロが教える店舗&オフィスのセキュリティ対策術

現在ListviewとImagelistを使って同じカテゴリの画像を表示させるものを作成しているのですが、画像が多いを読み込みに時間がかかるので、一度読み込んだImagelistは使い回しができないか試しているのですがうまくいきません・・・

試した方法なのですが、初回は普通に「Imagelist1」に読み込んで画像が多いもの(例えばImagelist1.Images.Countが20以上)の場合、Imagelistのコントロール?を配列(MyImageList(index))で作成してそれにコピー、次回はそのコピーしたものを表示するようにしてうまくいった(表示できた)と思ったのですが、一度「ImageList1.Images.Clear()」をするとなぜか関係ないはずのMyImageList(index)の方まで消えてしまうようです・・・なぜなのでしょうか?

色々試したのですが、どうしてもうまくいきません。Imagelistはこういう使い方はできないのでしょうか?

うまい使い回し(保存・維持)方法があったら教えてください。

VBは2008です。

A 回答 (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/valuereferen …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほどImagelistとは、こういう仕組み?(参照型)だったのですね。これで無関係なMyImageListが消えるのも納得です・・・というか無関係でなかったと・・・

参照型を理解した(多分)うえで、仕組みを変えてImagelist1は削除して、MyImageList(index)のみにして、画像を入れた後にMyImageList(index).Images.Countが30以上の場合はindexを1プラスして新たにMyImageList(index+1)を作成して次回はそれを使うというやり方にしてプラスされる前のindexの値とカテゴリーを紐付して何とか目的を達成できました。ありがとうございました。

お礼日時:2013/08/10 09:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!