以前、ファイルパス取得について質問させていただいた者です。
前の続きなのですが、今度はリストビューで表示されている順番で項目を取得したいのですが、
どのようにしたら取得できるのか、悩んでいます。
ListView1.Listitemsの各Indexには取得時の順番が入っているようで、
ソート処理を行っても、Indexは変化していないようです。
また、そのソート処理自体どのような処理になっているのかも理解できていない状態ですので、
どなたか、分かりやすくご指導お願いします。
> リストビューで表示されている順番で項目を取得したいのですが、...
> ソート処理を行っても、Indexは変化していないようです
VB6かな?
ListItemsコレクションで順に取得すればいいのでは?
順に取得するというのは、Indexでループさせるということでしょうか?
それとも他の方法ですか?
書き忘れていましたが、VB6を使ってますが、ListViewのバージョンは5.0です。
質問は、トライして、結果を見て、問題点を整理してから。
編集 削除表示された状態で、ListView1.Listitemsを見ると、表示されている順番と、
各アイテムのIndexは同じではありませんでした。
最初の質問にも書いたとおり、Indexは取得時の順番になっているようです。
ソート処理を見ても、中身がよくわかりませんでした。。。
リストに追加された順番がIndexだとおもっていたのですが、
表示順を知るには、なにが必要なのでしょうか?
>ListItemsコレクションで順に取得すればいいのでは?
の意味を勝手に補足すると
For eachでListItemsコレクションを順にとっていけば良いということです
おっさんは、お疲れモードで頭がよー回らん。
> Indexは取得時の順番になっているようです。
> ソート処理を見ても、中身がよくわかりませんでした。。。
Sorted プロパティだと思い込んでしまったが、
上の2行から推察するに、LVM_SORTITEMSメッセージを使った
lParamソートの様だ。だとすれば、すぐに解決策が浮かばない。
できれば、Sorted プロパティが使える様に工夫して欲しい。
For n = 1 To ListView1.ListItems.Count
Debug.Print ListView1.ListItems(n).Text
Next
これでどうしていけないのかな。
>ソート処理を行っても、Indexは変化していないようです。
既にソートされているとか。
ListView1.Sorted = True
でソートも正常に行われるし。
ソートって普通はABC順だと思うけど。
それと
>ListView1.Listitemsの各Indexには取得時の順番が入っているようで、
取得時って?
> 前の続きなのですが、
たぶん、このスレの続きみたいですね。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200412/04120087.txt
> 今度はリストビューで表示されている順番で項目を取得したいのですが、
何故、表示されている順番でなければいけないのか、目的を示さないと
有効な回答が得られないと思いますよ。
ソート処理は
>ListView1.Sorted = True
ではなく、
おっさんさんの言う
>LVM_SORTITEMSメッセージを使ったlParamソート
のようです。
>取得時って?
最初にListView1.listitemsにデータがセットされた状態です。
ソート処理後に見ても、中身は変わっていなかったんです。
>何故、表示されている順番でなければいけないのか、目的を示さないと
>有効な回答が得られないと思いますよ。
すみませんです。
やりたいことは、ListViewで選択された項目を、TextBoxに表示し、
名前を変更して、EnterキーでListViewの次の項目を選択させておきたいのです。
そのためには、次の項目が何なのかを知っておく必要があるので。。。
宜しくお願いします。
> ListViewで選択された項目を、TextBoxに表示し、名前を変更して、
> EnterキーでListViewの次の項目を選択させておきたいのです。
http://www.mvps.org/btmtz/vbexplorer/
のサンプルを使ってるんですね?
これは、ListItemsコレクションが作成された後、IShellFolder::CompareIDsメソッドを使用し、シェルアイテムのPIDLを比較して並べ替えしてから表示されるので、初期表示の段階でListItemsコレクションのIndex順と、実際の表示順が異なっているんでしょう。
で、表示順に関してIndexが使えないとなると、ソートした時に、表示順の情報を保管しておかない限り、表示領域の位置情報から次の項目を特定するしか手がないと思います。
例えば、SelectedItemプロパティ, LVM_GETITEMRECTメッセージ, HitTestメソッド等を組合せるとか。
続き物ですか(^^;
http://support.microsoft.com/default.aspx?scid=kb;EN-US;170884
原因とやり方が、ここに書いてあるような。
要するにキーイベント↓でいいのか?
編集 削除>> 表示領域の位置情報から次の項目を特定するしか手がないと思います。
いい加減なこと言ってすみません。
> http://support.microsoft.com/default.aspx?scid=kb;EN-US;170884
> 原因とやり方が、ここに書いてあるような。
ListViewコントロールのリストから順に取得すればよかったんですね。