[リストへもどる]
一括表示

投稿時間:2003/03/27(Thu) 16:00
投稿者名:はる
URL :
タイトル:
ListViewについて
お世話になっております。はるです。

ListViewをIcon形式で表示するプログラムを組んでいるのですが
ListViewに画像を表示させる為に、リストイメージと関連付ける時に、
関連付けるリストイメージというのは動的に変えられるのでしょうか?

あるファイルからListViewに表示するデータと画像のパスを読み込みます。
(データ件数は決まっていません)

データを取り込んだ後、イメージリスト(コントロール配列)を動的にLoadし
(イメージリストに取り込む画像データは10件、10件単位でイメージリストを
Loadする)画像データを設定します。

関連付けるイメージリストを変更しながらListViewに取り込んだデータを
表示します。

<例えば20件のデータがあった場合>
1〜10件のデータはImageList(0)にセットし、11〜20件のデータはImageList(1)にセットします。
ListViewに20件のデータを設定するときに、
1〜10件までのデータは
ListView.Icons = ImageList(0)
11〜20件までのデータは
ListView.Icons = ImageList(1)
としてデータを設定します。

この結果:
表示されるのは10〜20件までの画像データしか表示されません。
試しに、同じ内容で1〜10でループを止めた場合は、ちゃんと
1〜10件の画像データは表示されています。

ListViewに関連付けるImageListを動的に変更することはできないのでしょうか?

もしご存知の方がおられましたらご教授お願いいたします。

---------------------
環境:
OS:Win2k
Visual Basic6.0 SP5
---------------------

投稿時間:2003/03/27(Thu) 16:42
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: ListViewについて
> ListViewに画像を表示させる為に、リストイメージと関連付ける時に、
> 関連付けるリストイメージというのは動的に変えられるのでしょうか?

リストビューとイメージリストとの関連付けは、
    ListViewオブジェクト の Iconsプロパティ
    ListViewオブジェクト の SmallIconsプロパティ
    ListViewオブジェクト の ColumnHeaderIconsプロパティ
に保存されているので、ここに別のImageList(もしくはNothing)をSetすればOKです。


一方、イメージリストとListImageの関連付けは、
    ImageListオブジェクト の ListImagesプロパティ
に、ListImagesコレクションとして保存されており、実行時に
Add/Removeメソッドを使って内容を変更することができます。


また、リストビュー項目とListImageの関連付けは、
    ListItemオブジェクト の Iconプロパティ
    ListItemオブジェクト の SmallIconプロパティ
    ColumnHeaderオブジェクト の Iconプロパティ
にて変更できます。

投稿時間:2003/03/27(Thu) 18:16
投稿者名:はる
URL :
タイトル:
Re^2: ListViewについて
ご回答ありがとうございます。

動的に変更できるということなのですが、
下記の様なロジックを作成した時に、実際に画面が起動して
表示されているのは11〜20件までのデータのみで、
1件〜10件のデータは画像が表示されません。
プロパティ等の設定方法が間違っているのでしょうか?

何かおかしな所がありましたらご指摘願えませんでしょうか。

Sub Sub_Test
   Dim i   As Integer
   Dim j   As Integer
   Dim obj As Object

   'FormにはImageList(0)と、ListViewをセットしています

   'イメージリスト(1)をLoadする
   Load ImageList(1)

   'イメージリストに画像を取り込む
   For i = 1 To 20
      Select Case i
         '1件〜10件はImageList(0)にセット
         Case 1 To 10
            ImageList(0).ListImages.Add (i) , "AAA" & _

                                  CStr(i), LoadPicture("A" & cstr(i) & ".jpg")
         '11件〜20件はImageList(1)にセット
         Case 11 To 20
            ImageList(1).ListImages.Add (i - 10) , "AAA" & _
                                   CStr(i), LoadPicture("A" & cstr(i) & ".jpg")
      End Select
   Next i

  
   'リストビューに20件のデータを表示する(Icon形式)
   For i = 1 To 20
      Select Case i
         '1件〜10件はImageList(0)のアイコンを使う
         Case 1 To 10
           ListView.Icons = ImageList(0)
           j = i
     '11件〜20件はImageList(1)のアイコンを使う
         Case 11 To 20
           ListView.Icons = ImageList(1)
           j = i - 10
       End Select
       'ListViewにデータをセット
       Set obj = ListView.ListItems.Add(i, "B" & CStr(i), "X" & Cstr(i), j, j)
   Next i  
  
   Set obj = Nothing

End Sub

投稿時間:2003/03/27(Thu) 19:47
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: ListViewについて
> 動的に変更できるということなのですが、
> 下記の様なロジックを作成した時に、実際に画面が起動して

ListView.Iconsを動的に変更する事はできますが、変更すると、
既にListViewに登録したListItem全てが、その影響を受けます。



> 項目1〜10をListImage1から、項目11〜20をListImage2から、といったように

ImageListとListImageは別物なので、注意しましょう。(^^;)


それはさておき、ListViewと関連付けられるのは、一つのImageListだけなので、
表示させたい画像全てを一つのImageListにまとめておき、それをListView.Iconsに
割り当てるようにする必要があると思います。
  ImageList0.ListImages.Clear
  For Each LI In ImageList1.ListImages
     ImageList0.ListImages.Add , LI.Key, LI.Picture
  Next
  For Each LI In ImageList2.ListImages
     ImageList0.ListImages.Add , LI.Key, LI.Picture
  Next
  Set ListView1.Icons = ImageList0


> 1件〜10件のデータは画像が表示されません。

ListView.Iconsを変更すると、既存のListItem.Iconはクリアされますので、
ListView.Iconsの変更後は、ListItem.Iconの値を再設定する必要があります。


Option Explicit

Private Sub Form_Load()
    Me.ScaleMode = vbPixels
    Picture1.Move 0, 0, 16, 16
    Picture1.AutoRedraw = True
    Picture1.Visible = False
    Set ListView1.Icons = Nothing
    ImageList1(0).ListImages.Clear
    ImageList1(1).ListImages.Clear

    'ImageList1, ImageList2, ListView1の設定
    Dim I As Byte
    Dim X As String
    For I = 0 To 7
        X = "X" & CStr(I)
        Picture1.BackColor = QBColor(I)
        ImageList1(0).ListImages.Add , X, Picture1.Image
        Picture1.BackColor = QBColor(I + 8)
        ImageList1(1).ListImages.Add , X, Picture1.Image
        ListView1.ListItems.Add(Text:=X).Tag = X
    Next
    Command1(0).Caption = "ImageList1(0)の割り当て"
    Command1(1).Caption = "ImageList1(1)の割り当て"
End Sub

Private Sub Command1_Click(Index As Integer)
    Dim LI As ListItem

    'イメージリストの割り当てを変更する
    Set ListView1.Icons = ImageList1(Index)

    'ListView.Iconsを変更すると、ListItems.Iconの値が
    'クリアされてしまうので、もう一度設定しなおす
    For Each LI In ListView1.ListItems
        LI.Icon = LI.Tag
    Next
End Sub

投稿時間:2003/03/28(Fri) 09:25
投稿者名:はる
URL :
タイトル:
Re^4: ListViewについて
ご回答ありがとうございます。

>ImageListとListImageは別物なので、注意しましょう。(^^;)
ご指摘ありがとうございます。こんがらがっていました。


> それはさておき、ListViewと関連付けられるのは、一つのImageListだけなので、
> 表示させたい画像全てを一つのImageListにまとめておき、それをListView.Iconsに
> 割り当てるようにする必要があると思います。

最初は一つのImageListに画像を割り付けていたのですが、
件数が多くなると、ImageListに画像をLoadする時に「メモリ不足」が発生してしまい、
どうにか対処しようと思い、ImageListをコントロール配列にし、ある一定の件数で
ImageListをLoadしながら画像を割り当てていこうかなと思いました。
ただ、画像自体の割り当ては出来ても、ListViewに実際にデータを反映させた時に
最後に関連付けたImageListの画像しか乗せられないため、質問しました。

最終的にやりたい事は、ListViewにIcon形式で何件までのデータが表示できるのか
ということなのです。現状自分の使っているPC(Celeron800、256MB)では
ImageListを分割してLoad出来る画像が約7000件(画像はJpgで1画像辺り1KB〜6KB)程度です。
(最終的に表示したListViewには表示出来ていないですが・・)

ListViewのIcon形式に変わるコントロール、又は他に方法等あるのでしょうか?

何度も何度も申し訳ありませんが、ご教授お願いいたします。

投稿時間:2003/03/28(Fri) 19:47
投稿者名:PETA
Eメール:
URL :
タイトル:
Re^5: ListViewについて
> 最初は一つのImageListに画像を割り付けていたのですが、
> 件数が多くなると、ImageListに画像をLoadする時に「メモリ不足」が発生してしまい
VBのImageListコントロールは、400〜500件で「メモリ不足」になった記憶があります、
APIで作ったmageListを使えば、多分7000件位登録できるかも?(未確認)
これをVBのListViewで使うには、少しAPIを使う必要があります。

> 最終的にやりたい事は、ListViewにIcon形式で何件までのデータが表示できるのか
> ということなのです。現状自分の使っているPC(Celeron800、256MB)では
> ImageListを分割してLoad出来る画像が約7000件(画像はJpgで1画像辺り1KB〜6KB)程度です。

ImageListに7000件の画像が登録できたとして、ListViewで何件表示できるのかは
判りませんが、相当重くなるかも知れません。
そういう場合、仮想ListViewを使う方法も考えられますが、APIで作ることに
なると思います。これに相当する市販OCXは判りません。

投稿時間:2003/03/29(Sat) 12:13
投稿者名:はる
URL :
タイトル:
Re^6: ListViewについて
ご回答ありがとうございます。

> VBのImageListコントロールは、400〜500件で「メモリ不足」になった記憶があります、
> APIで作ったmageListを使えば、多分7000件位登録できるかも?(未確認)
> これをVBのListViewで使うには、少しAPIを使う必要があります。

> ImageListに7000件の画像が登録できたとして、ListViewで何件表示できるのかは
> 判りませんが、相当重くなるかも知れません。
> そういう場合、仮想ListViewを使う方法も考えられますが、APIで作ることに
> なると思います。これに相当する市販OCXは判りません。

いつもコントロールを使っていたため、どうにかVBで装備されているもので
と思ったのですが(もしくは他のOCX等)、APIでチャレンジしてみようと思います。

ありがとうございました。