Imagelistの使い回しについて

このQ&Aのポイント
  • 現在、ListviewとImagelistを使用して同じカテゴリの画像を表示させる方法を試しています。しかし、画像の読み込みに時間がかかります。そこで、Imagelistを使い回す方法を試していますがうまくいきません。
  • 試した方法としては、初回はImagelistに画像を読み込みます。画像が多い場合は、配列を使ってそのコピーを作成し、次回以降はそのコピーを表示するようにしています。ただし、ImagelistのImagesをクリアすると、コピーも消えてしまいます。
  • 色々試しましたが、Imagelistの使い回しにうまい方法が見つかりません。どなたか助けていただけると嬉しいです。VBは2008を使用しています。
回答を見る
  • ベストアンサー

Imagelist の使い回しについて

現在ListviewとImagelistを使って同じカテゴリの画像を表示させるものを作成しているのですが、画像が多いを読み込みに時間がかかるので、一度読み込んだImagelistは使い回しができないか試しているのですがうまくいきません・・・ 試した方法なのですが、初回は普通に「Imagelist1」に読み込んで画像が多いもの(例えばImagelist1.Images.Countが20以上)の場合、Imagelistのコントロール?を配列(MyImageList(index))で作成してそれにコピー、次回はそのコピーしたものを表示するようにしてうまくいった(表示できた)と思ったのですが、一度「ImageList1.Images.Clear()」をするとなぜか関係ないはずのMyImageList(index)の方まで消えてしまうようです・・・なぜなのでしょうか? 色々試したのですが、どうしてもうまくいきません。Imagelistはこういう使い方はできないのでしょうか? うまい使い回し(保存・維持)方法があったら教えてください。 VBは2008です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.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

jun_jii
質問者

お礼

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

関連するQ&A

  • c# listview、sidebarについて

    listviewとsaidebarについてお聞きします。 listviewやsaidebarにimagelistの画像を表示させたいのですが どのように表記したら良いでしょうか? pictureboxの場合は picturebox1.image=imagelist1.images[0] で表示できましたが、listviewやsidebarではエラーになります。 宜しくお願いいたします。

  • VB.NET リストビュー内で移動

    いつもお世話になっております。 ListViewとImageListを組み合わせ画像一覧表示できるように プログラムをしたのですが、 その際にドラッグ&ドロップでListView内の画像を移動(並び替え)を行いたいのですが、そのような方法はあるのでしょうか。 ListViewからListViewの移動は行えたのですが、一つのListView内での 移動が検索してもわからず投稿致しました。 ご教授お願い致します。

  • イラストレーター埋め込み画像の使い回しについて

    お世話になっております。 イラストレーターの埋め込み画像についてです。 先方からいただいたイラストレーターのQRコード画像が埋め込み画像になっていました。 そのデータでは問題なく印刷できましたが、 例えばその埋め込み画像をコピーして新規作成したイラストレーターデータにペーストした時にも問題なく使えるのでしょうか。 リンクではないので画像が消えたりすることは無いと理解していますが、例えば劣化や画像情報の変化?など起こることはあるのでしょうか。 埋め込み画像の使い回しについて考えたことがなかったので、少し考え過ぎかもしれませんがよろしくお願いいたします。

  • Listviewに表示された文字のコピーペースト

    VB2005を使っています。 Listviewに表示された文字をコピーペーストを試みましたができませんでした。 プロパティを見ても、設定箇所が見あたりませんでした。 コピーペーストする方法をご存じでしたらご教授お願いします。

  • dreamweaver ~リンク画像について~

    Aのフォルダにindex.htmlとimagesのフォルダがあります。 Bのフォルダにindex.htmlをコピーすると、画像のリンクが外れてしまいます。 imagesのフォルダはそのままの場所で Bのフォルダにコピーしたindex.htmlファイルの リンクが外れてた画像を繋ぎなおすには 1つずつ再設定してやるしか方法は無いのでしょうか。 簡単な方法をご存知ですか?

  • ListViewの複数項目削除で再度質問です

    ArrayListのソートの件とListViewのおかしな挙動は解決できたのですが 最初に質問して解決したはずの削除の部分で再び分からなくなって しまったので質問させて頂きます。 今回は本体に今までのコードを正式に組み込んで、動作の確認を 行っていたのですが、複数件(連続や個別選択)のデータ削除を 行おうとしたら意図しないデータ(未整列状態の並びのデータ)が 削除されてしまうという事態が発生してしまいました。 これはどうすれば解決できるのでしょうか? また複数件の未読既読を制御(選択された項目に対してフラグを 入れ替える)するのも同様の方法で出来るのでしょうか? 環境はVS2005(C#)、.NET Framework2.0です。 以下に問題の削除時のコードを載せます。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[RECEIVE][sel_index]); collectionMail[RECEIVE].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ // 送信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[SEND][sel_index]); collectionMail[SEND].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "差出人または宛先"){ // 削除メールのとき if(MessageBox.Show("選択されたメールは完全に削除されます。\nよろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK){ for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].RemoveAt(sel_index); } } this.textBody.Text = ""; } } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); // 選択している位置がリストの件数よりも少ないとき if(currentRow < listView1.Items.Count){ // 選択していた位置-1の行にフォーカスを当て直す listView1.Items[currentRow - 1].Selected = true; listView1.Items[currentRow - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } else{ // リストの件数が1以上の時 if(listView1.Items.Count > 0){ // ListViewの行数位置-1の行にフォーカスを当て直す listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items[listView1.Items.Count - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } } }

  • jQueryで、フェイドイン・フェイドアウトを追加

    fullscreenのはできたのですが、そこからのフェイドインをしてフェイドアウトをしていく仕組みを作ろうと思っていたのですが、そこだけがどうしても組み込めずにいるので助けていただけませんんでしょうか。 色々スクリプトを合体させてみたらりしてみました。 止む終えなく挫折してしまいました。 // 画像の配列を作成 var images = [ "img_001.jpg", "img_002.jpg", "img_003.jpg" ]; // 指定画像をプリロードする $(images).each(function(){ $('<img/>')[0].src = this; }); var index = 0; // 背景をコール。下記の場合、500ミリ秒で呼び出します。 $.fullscreen(images[index], {speed: 500}); setInterval(function() { index = (index >= images.length - 1) ? 0 : index + 1; $.fullscreen(images[index]); }, 5000);

  • .net 2010VB配列TextBox貼り付ける

    初めて質問致します。 よろしくお願い致します。 超初心者レベルです。 VB6の時に、Formにテキストボックスやラベルなどを1つ貼り付け、それをコピーすると「配列にするか?」と聞かれていました。 今、.net 2010 VB でテキストボックス(ラベル)をコピーしても、配列にするかどうか聞いてくれません。 プログラム等ではなく、手動でFormに貼り付け時に、配列にする方法を教えて下さい。 (どのプロパティが、配列のインデックスなのかが分かりません。) <(__)>

  • ListViewコントロールでサムネイル画像を一覧表示するには?

    VB初心者です。 .NET TIPSの中に「ListViewコントロールでサムネイル画像を一覧表示するには?」というものがありました 今回、それを利用してサムネイル一覧の表示をしようとして行き詰りました。 作りたいのは以下のものです ○決まったサイズの画像(bitmap)を表示し、その下にファイル名(フルパスでは無い)を表示し、更にその下に元の画像のサイズを表示するようなものを作成したいのですが、作成可能でしょうか? また、作成可能な場合、どういった方法で作成したら良いか教えて下さい。 行き詰ったのは、第一段階の、サムネイル画像のしたのファイル名の所です。 よく分からずに ListView1.Items.Add(bmpFiles(i), i)の所を Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFileName) bmpFileName(ファイル名のみ)に変更したら、ファイル名は表示されるのですが、画像が表示されませんでした。 次に両方書いたのですが画像の下にフルパスその横にファイル名が表示されます。 Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFiles(i), i) ListView1.Items.Add(bmpFileName) 色々調べてみたのですが、思ったような記述が無かったのでここで質問させて頂きました。 拙い質問なので分かり難いかと思いますがアドバイスをよろしくお願いいたします。

  • C#2005 Imagelistの余白の除去について

    お世話になります。 ListviewにImagelistを代入し、表示するものを作成しております。 枠のサイズは100×100で、実際のjpeg画像は約100×75です。 しかしながら、画像以外の箇所の色指定もしくは透過色を指定したいのですが、変更されません。 以下にサンプルコードと画面サンプルを登録させていただきます。 // 幅w、高さhのImageオブジェクトを作成 Image createThumbnail(Image image, int w, int h) { Bitmap canvas = new Bitmap(w, h); Graphics g = Graphics.FromImage(canvas); g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h); float fw = (float)w / (float)image.Width; float fh = (float)h / (float)image.Height; float scale = Math.Min(fw, fh); fw = image.Width * scale; fh = image.Height * scale; g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh); g.Dispose(); return canvas; } private void button2_Click(object sender, EventArgs e) { string imageDir = @"C:\thumbnailTest\Image"; // 画像ディレクトリ string[] jpgFiles = System.IO.Directory.GetFiles(imageDir, "*.jpg"); int width = 100; int height = 100; imageList1.ImageSize = new Size(width, height); listView1.LargeImageList = imageList1; imageList1.TransparentColor = Color.Transparent; for (int i = 0; i < jpgFiles.Length; i++) { Image original = Bitmap.FromFile(jpgFiles[i]); Image thumbnail = createThumbnail(original, width, height); imageList1.ColorDepth = ColorDepth.Depth24Bit; imageList1.Images.Add(thumbnail); listView1.Items.Add(jpgFiles[i], i); original.Dispose(); thumbnail.Dispose(); } } お手数ですが、ご教授いただきたく宜しくお願い申し上げます。

専門家に質問してみよう