Przewijanie listy VirtualStringTree

0

Witam.

Podczas ładowania danych do komponentu VirtualStringTree
jeden wiersz jest zaznaczony w taki sposób:

  var PVN:PVirtualNode;     
  ...............................................
  VSTRaport.FocusedNode:=PVN;
  VSTRaport.Selected[PVN]:=True;

Jak teraz po załadowaniau wszystkich danych - wierszy przewinąć
ją do miejsca zaznaczenie - poprzez scrollBar do wiersza który ma focus ???
Standardowo lista VirtualStringTree jest przewinięta na samą górę

Adam

0

scrollintoview

0

No niestety Panie Programisto używałem i nie przewija tej listy.

 if PVN.Index=MemIndexDok then
 begin
  VSTRaport.FocusedNode:=PVN;
  VSTRaport.Selected[PVN]:=True;
 end;

VSTRaport.ScrollIntoView(PVN,True,False);

//MemIndex - index edytowanego dokumentu

Może jakaś inna mądra podpowiedź bo jak nie Pan Panie programisto to
kto jak drugi ma grypę :)

1

no popatrz a u mnie działa

0

No a u mnie nie :( Może jeszcze jakaś właściwość komponentu ma być ustawiona.

No a w sumie na tym forum to pomagasz czy drwisz z innych - są tematy których i ty
będziesz potrzebował pomocy :)

Adam

0

Ok dam więcej kodu może po drodze jest coń nie tak...... może PVN nie pokazuje właściwego Node.

 
var 
 I:Integer;
 VSTBgColor:TColor;
 PVN:PVirtualNode;
begin
..................................................    
  I:=1; //licznik pozycji
    while not IBQueryRaport.Eof do
    begin
     VSTRaport.RootNodeCount:=VSTRaport.RootNodeCount+1;//kolejne linie
     PVN:=VSTRaport.GetLast;
     DataVSTRaportFVSprzedZakup:=VSTRaport.GetNodeData(PVN);
     DataVSTRaportFVSprzedZakup.Lp:=I;
     DataVSTRaportFVSprzedZakup.IdFVdaneSprzed:=IBQueryRaport.FieldByName('id').AsInteger;
     ............................................................................................................................
     
     Inc(I);
     
    if PVN.Index=MemIndexDok then
     begin
      VSTRaport.FocusedNode:=PVN;
      VSTRaport.Selected[PVN]:=True;
      VSTRaport.ScrollIntoView(PVN,True,False); //<<-- BYŁO TEZ POZA PĘTLĄ I W PĘTLI PODCZAS KAŻDEGO WYWOŁANIA I TEŻ NIC Z TEGO
     end;
     
     IBQueryRaport.Next;
     Application.ProcessMessages;
    end;
    VSTRaport.Header.SortColumn:=0;
    VSTRaport.Header.SortDirection:=sdDescending;
0

a nie masz przypadkiem przed tą procedurą BeginUpdate na VST?

0

No właśnie było
VSTRaport.BeginUpdate ........... także serdeczne dzięki :)

Tylko że teraz znacznie dłużej ładuje liste
scrollintoview mom w pętli zaraz po zaznaczeniu wiersza........ może ma być gdzieś indziej żeby było szybciej

     if PVN.Index=MemIndexDok then
     begin
      VSTRaport.FocusedNode:=PVN;
      VSTRaport.Selected[PVN]:=True;
      VSTRaport.ScrollIntoView(PVN,True,False);
     end;
 

Adam

0

najpierw wypelnij liste z beginupdate...endupdate a po zakonczeniu zaznacz wiersz...

0

Jasne....... właśnie też tak to rozwiązałem

po pętli while jeszcze raz lecę po wierszach i zaznaczam

 
PVN:=VSTRaport.GetFirst;
   while PVN.Index<VSTRaport.RootNodeCount do
   begin
    if PVN.Index=MemIndexDok then
    begin
     VSTRaport.FocusedNode:=PVN;
     VSTRaport.Selected[PVN]:=True;
     VSTRaport.ScrollIntoView(PVN,True,True); //przewiniecie do zaznaczonego
     break;
    end;
    PVN:=VSTRaport.GetNext(PVN);
   end;

Serdeczne dzięki wszystkim za pomoc

Adam

0

poruszanie się po vtv masz nie wg zaleceń - powinno być tak

node := vst.GetFirst;
while node <> nil do
begin
  //cokolwiek potrzebujesz zrobić na nodzie
  node := vst.GetNext(node);
end;

w Twoim przypadku coś w deseń

node := vst.GetFirst;
while (node <> nil) and (node.Index <> MemIndexDok) do
  node := vst.GetNext(node);
if node <> nil then
begin
  VSTRaport.FocusedNode:=PVN;
  VSTRaport.Selected[PVN]:=True;
  VSTRaport.ScrollIntoView(PVN,True,True); //przewiniecie do zaznaczonego
end;

Nie pamiętam czemu ale gdzieś wyczytałem, że sprawdzanie PVN.Index<VSTRaport.RootNodeCoun może w pewnych przypadkach działać inaczej niż można by oczekiwać.

BTW nie prościej zapamiętać noda do zaznaczenia podczas dodawania zamiast później szukać go raz jeszcze?

0

U mnie przewija i zaznacza poprawnie

VST.BeginUpdate;
//...
VST.EndUpdate;
          
VST.Selected[Node] := True; //najpierw zaznacz
VST.FocusedNode    := VST.GetFirstSelected; //teraz daj fokus

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