検索結果が最上位になるようにスクロールさせるには?

解決


おかっぴき  2005-06-22 04:52:37  No: 15827

いつもお世話になっています。
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;

↑選択までしかできません(*_*)よろしくお願いします。


それは  2005-06-22 05:46:26  No: 15828

TopItem を見ながら自前でスクロール、ですね。


メラトニン  2005-06-22 09:09:20  No: 15829

ListView1.Items[i].Selected:=True;
  ListView1.Items[i].Focused:=true;
  ListView1.Items[i].MakeVisible(true);
です。


ほんとに?  2005-06-22 11:51:53  No: 15830

ヘルプより

TListItem.MakeVisible

MakeVisible メソッドは,リスト項目が表示されるようにします。必要であればリストビューをスクロールします。

>該当する行がでてきたら最上位に表示されるよう
>スクロールさせたいのですがどうしたらいいでしょうか?

MakeVisible で「最上位」になるんですか?


おかっぴき  2005-06-22 15:11:48  No: 15831

皆様回答ありがとうございます。
メラトニンさんのMakeVisible(True)を追加すると
スクロールされました。ただし最下行でした。
横スクロールバーが出てる状態だと隠れてしまいました。
そこで
1.現在表示されてる行数を取得
2.自前で1.の行数分スクロールさせる。
もしくは、それはさんが示したとおり
Topitemが選択状態になるまで自前でスクロールさせる。
で実現できそうですが、それはさんがいうところの自前で
スクロールさせる方法がわかりません(T_T)
どういう風に書くのでしょうか?
あと、最上位と書いてますが、item数が表示行数より少ない場合は
画面内にあればいいかな?と。(むしろ選択状態であればほどよい位置の
方がわかりやすかったりして。。。)


おかっぴき  2005-06-22 20:11:38  No: 15832

自己レスです。
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;

こんなかんじにしてみたらとりあえず動きました。
ありがとうございました。


おかっぴき  2005-06-22 20:27:24  No: 15833

すみません。追記です。
スクロール時にフォーカスがないと動きませんでした。

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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加