いつもお世話になっています。
TListViewで任意の行を検索して
該当する行がでてきたら最上位に表示されるよう
スクロールさせたいのですがどうしたらいいでしょうか?
TListViewの中身を書き換えて最上位に表示したいわけでは
ありません。
for i:=0 to ListView1.Items.Count-1 do begin
if ListView1.Items[i].Caption='ほにゃらら' then begin
ListView1.Items[i].Selected:=True;
ListView1.ItemFocused:=ListView1.Items[i];
exit;
end;
end;
↑選択までしかできません(*_*)よろしくお願いします。
TopItem を見ながら自前でスクロール、ですね。
ListView1.Items[i].Selected:=True;
ListView1.Items[i].Focused:=true;
ListView1.Items[i].MakeVisible(true);
です。
ヘルプより
TListItem.MakeVisible
MakeVisible メソッドは,リスト項目が表示されるようにします。必要であればリストビューをスクロールします。
>該当する行がでてきたら最上位に表示されるよう
>スクロールさせたいのですがどうしたらいいでしょうか?
MakeVisible で「最上位」になるんですか?
皆様回答ありがとうございます。
メラトニンさんのMakeVisible(True)を追加すると
スクロールされました。ただし最下行でした。
横スクロールバーが出てる状態だと隠れてしまいました。
そこで
1.現在表示されてる行数を取得
2.自前で1.の行数分スクロールさせる。
もしくは、それはさんが示したとおり
Topitemが選択状態になるまで自前でスクロールさせる。
で実現できそうですが、それはさんがいうところの自前で
スクロールさせる方法がわかりません(T_T)
どういう風に書くのでしょうか?
あと、最上位と書いてますが、item数が表示行数より少ない場合は
画面内にあればいいかな?と。(むしろ選択状態であればほどよい位置の
方がわかりやすかったりして。。。)
自己レスです。
var pt,p:Tpoint;
としておいて
pt:=ListView1.TopItem.Position;//先頭項目のPositionを取得
for i:=0 to ListView1.Items.Count-1 do begin
if ListView1.Items[i].Caption='ほにゃらら' then begin
ListView1.Items[i].Selected:=True;
ListView1.ItemFocused:=ListView1.Items[i];
p:=ListView1.Items[i].Position;//選択項目のPositionを取得
ListView1.Scroll(0,p.Y-pt.Y);//差分をスクロールさせる。
exit;
end;
end;
こんなかんじにしてみたらとりあえず動きました。
ありがとうございました。
すみません。追記です。
スクロール時にフォーカスがないと動きませんでした。
pt:=ListView1.TopItem.Position;//先頭項目のPositionを取得
for i:=0 to ListView1.Items.Count-1 do begin
if ListView1.Items[i].Caption='ほにゃらら' then begin
ListView1.Items[i].Selected:=True;
ListView1.ItemFocused:=ListView1.Items[i];
p:=ListView1.Items[i].Position;//選択項目のPositionを取得
ListView1.SetFocus;//***追記***
ListView1.Scroll(0,p.Y-pt.Y);//差分をスクロールさせる。
exit;
end;
end;
ツイート | ![]() |