リストビューに表示されている一覧を取得するには?


ABC  2004-12-20 14:45:29  No: 118396  IP: [192.*.*.*]

以前、ファイルパス取得について質問させていただいた者です。

前の続きなのですが、今度はリストビューで表示されている順番で項目を取得したいのですが、
どのようにしたら取得できるのか、悩んでいます。

ListView1.Listitemsの各Indexには取得時の順番が入っているようで、
ソート処理を行っても、Indexは変化していないようです。
また、そのソート処理自体どのような処理になっているのかも理解できていない状態ですので、

どなたか、分かりやすくご指導お願いします。

編集 削除
おっさん  2004-12-20 16:46:16  No: 118397  IP: [192.*.*.*]

> リストビューで表示されている順番で項目を取得したいのですが、...
> ソート処理を行っても、Indexは変化していないようです

VB6かな?
ListItemsコレクションで順に取得すればいいのでは?

編集 削除
ABC  2004-12-20 16:53:32  No: 118398  IP: [192.*.*.*]

順に取得するというのは、Indexでループさせるということでしょうか?
それとも他の方法ですか?

書き忘れていましたが、VB6を使ってますが、ListViewのバージョンは5.0です。

編集 削除
おっさん  2004-12-20 20:22:33  No: 118399  IP: [192.*.*.*]

質問は、トライして、結果を見て、問題点を整理してから。

編集 削除
ABC  2004-12-20 20:39:16  No: 118400  IP: [192.*.*.*]

表示された状態で、ListView1.Listitemsを見ると、表示されている順番と、
各アイテムのIndexは同じではありませんでした。
最初の質問にも書いたとおり、Indexは取得時の順番になっているようです。

ソート処理を見ても、中身がよくわかりませんでした。。。
リストに追加された順番がIndexだとおもっていたのですが、
表示順を知るには、なにが必要なのでしょうか?

編集 削除
DEF  2004-12-20 23:41:43  No: 118401  IP: [192.*.*.*]

>ListItemsコレクションで順に取得すればいいのでは?
の意味を勝手に補足すると
For eachでListItemsコレクションを順にとっていけば良いということです

編集 削除
おっさん  2004-12-21 01:06:01  No: 118402  IP: [192.*.*.*]

おっさんは、お疲れモードで頭がよー回らん。

> Indexは取得時の順番になっているようです。
> ソート処理を見ても、中身がよくわかりませんでした。。。

Sorted プロパティだと思い込んでしまったが、
上の2行から推察するに、LVM_SORTITEMSメッセージを使った
lParamソートの様だ。だとすれば、すぐに解決策が浮かばない。
できれば、Sorted プロパティが使える様に工夫して欲しい。

編集 削除
ねろ  2004-12-21 08:17:04  No: 118403  IP: [192.*.*.*]

For n = 1 To ListView1.ListItems.Count
     Debug.Print ListView1.ListItems(n).Text
Next
これでどうしていけないのかな。

>ソート処理を行っても、Indexは変化していないようです。
既にソートされているとか。
ListView1.Sorted = True  
でソートも正常に行われるし。
ソートって普通はABC順だと思うけど。

それと
>ListView1.Listitemsの各Indexには取得時の順番が入っているようで、
取得時って?

編集 削除
FMY  2004-12-21 11:30:08  No: 118404  IP: [192.*.*.*]

> 前の続きなのですが、

たぶん、このスレの続きみたいですね。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200412/04120087.txt

> 今度はリストビューで表示されている順番で項目を取得したいのですが、

何故、表示されている順番でなければいけないのか、目的を示さないと
有効な回答が得られないと思いますよ。

編集 削除
ABC  2004-12-21 11:52:13  No: 118405  IP: [192.*.*.*]

ソート処理は

>ListView1.Sorted = True

ではなく、
おっさんさんの言う

>LVM_SORTITEMSメッセージを使ったlParamソート

のようです。

>取得時って?
最初にListView1.listitemsにデータがセットされた状態です。
ソート処理後に見ても、中身は変わっていなかったんです。

>何故、表示されている順番でなければいけないのか、目的を示さないと
>有効な回答が得られないと思いますよ。
すみませんです。
やりたいことは、ListViewで選択された項目を、TextBoxに表示し、
名前を変更して、EnterキーでListViewの次の項目を選択させておきたいのです。
そのためには、次の項目が何なのかを知っておく必要があるので。。。

宜しくお願いします。

編集 削除
FMY  2004-12-21 15:31:14  No: 118406  IP: [192.*.*.*]

> ListViewで選択された項目を、TextBoxに表示し、名前を変更して、
> EnterキーでListViewの次の項目を選択させておきたいのです。

http://www.mvps.org/btmtz/vbexplorer/
のサンプルを使ってるんですね?
これは、ListItemsコレクションが作成された後、IShellFolder::CompareIDsメソッドを使用し、シェルアイテムのPIDLを比較して並べ替えしてから表示されるので、初期表示の段階でListItemsコレクションのIndex順と、実際の表示順が異なっているんでしょう。

で、表示順に関してIndexが使えないとなると、ソートした時に、表示順の情報を保管しておかない限り、表示領域の位置情報から次の項目を特定するしか手がないと思います。
例えば、SelectedItemプロパティ, LVM_GETITEMRECTメッセージ, HitTestメソッド等を組合せるとか。

編集 削除
ねろ  2004-12-21 15:41:48  No: 118407  IP: [192.*.*.*]

続き物ですか(^^;
http://support.microsoft.com/default.aspx?scid=kb;EN-US;170884
原因とやり方が、ここに書いてあるような。

編集 削除
Mr.X  2004-12-22 04:28:57  No: 118408  IP: [192.*.*.*]

要するにキーイベント↓でいいのか?

編集 削除
FMY  2004-12-22 11:55:48  No: 118409  IP: [192.*.*.*]

>> 表示領域の位置情報から次の項目を特定するしか手がないと思います。
いい加減なこと言ってすみません。

http://support.microsoft.com/default.aspx?scid=kb;EN-US;170884
> 原因とやり方が、ここに書いてあるような。
ListViewコントロールのリストから順に取得すればよかったんですね。

編集 削除