仮想リストでファイル検索を順次表示したいです – プログラミング – Home

仮想リストでファイル検索を順次表示した...
 
通知
すべてクリア

[解決済] 仮想リストでファイル検索を順次表示したいです


kikito
 kikito
(@kikito)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

VC++6.0 MFC WindowsXP sp2

ファイルの検索処理を行っております。
仮想リストを利用してビューにアイテムを表示しているのですが、
仮想リストを使用すると画面の幅分のアイテムをいっきに表示しているので
検索で見つかったアイテムをすぐに表示することができません。
なにか良いアイディアがおありでしたら教えてください。


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CListCtrlの仮想リストコントロールの事ですか?
仮想リストコントロールの場合、CListCtrlからの要請にしたがって表示する内容を
CListCtrlに渡すような感じだったと思うんですが、
常に最後に追加したアイテムを表示したいのであれば、
CListCtrlに対してそのアイテムを表示するように指示すればよいのではないでしょうか?
CListCtrlのメンバー関数を使えば出来ると思いますけれど。
メンバー関数の一覧とにらめっこしてみてはどうでしょう?


返信引用
ars
 ars
(@ars)
ゲスト
結合: 19年前
投稿: 13
 

検索プロセスをスレッド化して
検索結果が増えるたびに
SetItemCount
RedrawWindow
をコールすればいいんじゃないでしょうか?
この場合、メモリ上のリストにスレッドとリストビューと同時にアクセスする
可能性があるから排他制御にも注意が必要ですが。


返信引用
kikito
 kikito
(@kikito)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

更新されるタイミングでスクロールバーが初期化(一番上になる)されるのですが、
何かうまい方法ってご存知の方教えてください。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

Scrollメソッドでスクロールさせても駄目なんですか?
仮想リストコントロールの説明を読む限りでは行けそうな気がするんですけれど。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

以下のコードでうまく動いているようです。

CLIstCtrl m_lvwData;
int m_iCount;

// この辺にm_iCountを増やす処理

m_lvwData.SetItemCountEx(m_iCount);
CSize size = m_lvwData.ApproximateViewRect();
m_lvwData.Scroll(size);


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

因みに上記のコードはかなり省略して核心の部分だけです。
足りない部分は補完して考えてください。


返信引用
tokai
 tokai
(@tokai)
ゲスト
結合: 19年前
投稿: 2
 

PATIOさんの通りに実行してみました。

結果ですが、
何かアイテムを選択しないとスクロールが初期化されてしまいます。
選択した場合、選択したアイテムが画面のTOPに表示されてしまいます。

アイテムを選択しない場合でもスクロールの初期化をしないようにするにはどうすれば
よいでしょうか


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

うーん、私のところでは特にアイテムの選択をしたりしていないんですが、
普通にスクロールしてくれます。追加した行が最後の追加される形になりますが、
表示はきちんと追随してくれています。

他の部分の処理で初期化が起こるような処理が入っていないでしょうか。
私が実験した最小限の環境では、CListCtrlにオーナーデータの設定を行い、
レポート形式に設定しているだけです。
コードの追加もInitDialogでカラムの追加とイメージリストの設定、
SetItemCountExで1を設定。

OnLvnGetdispinfoLvwDataで同じ文字列をひたすら返すだけのコード

カウントを増やすためのボタンをつけてますが、
これのクリック時の処理に提示したコードがあるだけの状態です。

これでうまく動作しているようなのでこれ以外の処理をCListCtrlに行っている所に
原因があるのではとも思うのですけれど。

もしかして.NET2003だと動作が変わるんでしょうか。
実験したのが.NET2003だったので。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

> 更新されるタイミングでスクロールバーが初期化(一番上になる)されるのですが、
> 何かうまい方法ってご存知の方教えてください。

とりあえずヘルプを見ただけですが、

listCtrl.SetItemCountEx(count, LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);

でいかがでしょう?
外してたらすみません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

全く同じコードをVC6でも試してみましたが、うまく動きます。
選択状態を常に表示するにしておいて選択してみましたが、
動きは変わらず。選択してもしなくても動作は同じようです。
因みに私のコードでは、LVSICF_NOSCROLLを指定していません。
LVSICF_NOINVALIDATEALLはデフォルト値のようです。

テスト用のコードの中で使用しているCListCtrlクラスのメソッドは、
以下のものだけです。他のメソッドは一切使用していません。

InsertColumn
SetImageList
SetItemCountEx
ApproximateViewRect
Scroll

既に書いていますが、最小限のコードでは動くようなので
CListCtrlに対して他の処理を行ったりしていないでしょうか?
もしくは、RedrawWindow等のコードが他の部分に残っていませんか?


返信引用
kikito
 kikito
(@kikito)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

Kerry さんの方法で無事できました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました