Scrollowanie TListView

0

Witam.
Mam taki problem.
Załóżmy, że na Liście TListView mam 100 wpisów - kazdy wpis reprezentuje np. nazwę zwierzęcia.

Obok mam TEdit, w którym mam za zadanie wyszukać jakiś wpis, np: PIES.
Realizuję to poprzez (w OnChange):

ListItem:=ListView1.FindCaption(1,'Pies',true,true,true);

Uzyskuje indeks znalezionego.
Wtedy mogę go zaznaczyć i np. wywołać jakąś procedurę.
Chciałbym jednak, aby Suwak TListView przesunął się tak, aby było widać zaznaczony ten wyszukany element.

Wiem, że można scrollować o jedną linię w dół (np).

LisView1.Perform(WM_VScroll, SB_LINEDOWN, 1);

Jak zrobić, by przewinęło się na tę określoną pozycję? Czyli np. jeśli "Pies" ma indeks 78, to żeby tak się suwak przesunął, żeby było widać ten wpis zaznaczony na liście....
Bardzo proszę o pomoc.
Pozdr, Pepe

0

podejrzewam, że wystarczy ustawić odpowiedni itemindex.

0
ŁF napisał(a)

podejrzewam, że wystarczy ustawić odpowiedni itemindex.

Zrobiłem tak:

       ListView1.Perform(WM_VScroll, SB_TOP, 0); //przewiń na samą górę
// w petli przewijam o określoną ilość lini (do znalezionego indeksu)
       for i:=0 to listitem.Index-5 do // -5 żeby mniej więcej wyśrodkować
          ListView1.Perform(WM_VScroll, SB_LINEDOWN,0);

Czy to się tak robi profesjonalnie? Czy może przekombinowałem.
Teoretycznie to to działa... Choć nie przetestowałem wszystkich przypadków jeszcze.

Proszę o wskazówki.
Dzięki.

0

Przykład z wyszukiwaniem tekstu i zaznaczaniem:

procedure TSearchForm.Button11Click(Sender: TObject);
var
Q : integer;
begin
ListView.Selected := ListView.Items[-1];
for Q := 0 to ListView.Items.Count -1 do
 begin
  if Pos(EditWyszukaj.Text, ListView.Items[q].Caption) > 0 then
   begin
     ListView.SetFocus;
     ListView.Selected := ListView.Items[q];
     ListView.Scroll(0, (ListView.Items[q].Top) - 100);
   end;
 end;
end;
0
Opi napisał(a)

Przykład z wyszukiwaniem tekstu i zaznaczaniem:

procedure TSearchForm.Button11Click(Sender: TObject);
var
Q : integer;
begin
ListView.Selected := ListView.Items[-1];
for Q := 0 to ListView.Items.Count -1 do
 begin
  if Pos(EditWyszukaj.Text, ListView.Items[q].Caption) > 0 then
   begin
     ListView.SetFocus;
     ListView.Selected := ListView.Items[q];
     ListView.Scroll(0, (ListView.Items[q].Top) - 100);
   end;
 end;
end;

Hej. Twój sposób działa, lecz nie całkiem tak jak chcę (nie wyszukuje poprawnie).
Ale użyłem: ListView.Scroll(0, (ListView.Items[q].Top) - 100);

A ostatecznie mam tak. Ta procedurka wywoływana jest w zdarzeniu OnChange, TEdit.

procedure TMainFrm.WyszukajCos;
begin
   try
    ListItem:=ListView.FindCaption(1,SzukajE.Text,true,true,true);
    SzukajL.Caption:='Znaleziono : '+#13+ '   ' + ListItem.Caption;
     //ListView.SetFocus;
     ListView.Items[ListItem.Index].Selected:=true;
     ListViewClick(nil);
     ListView.Scroll(0, (ListView.Items[ListItem.Index].Top) - 100);
   except
       SzukajL.Caption:='Brak wyników wyszukiwania';
   end;
end;

Pozdrowka, dzieki za podpowiedzi.

0

Czy nie prosciej tak:

procedure TForm1.Edit1Change(Sender: TObject);
var Item:TListItem;
begin
  Item:=ListView1.FindCaption(0,Edit1.Text,true,true,true);
  if Item<>nil then
  begin
    ListView1.Selected:=Item;
    ListView1.ItemFocused:=Item;
    Item.MakeVisible(false);
    ListView1.HideSelection:=false;
  end
  else ListView1.HideSelection:=true;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1