Бесконечная прокрутка VirtualTreeView

Есть ли способ реализовать бесконечную прокрутку с помощью virtualtreeview?

Я хотел бы загружать заданное количество записей базы данных за раз и добавлять их в virtualtreeview, когда пользователь прокручивает страницу вниз. Но я не уверен, как запустить добавление новых строк.


person stephenwebber    schedule 03.09.2015    source источник
comment
Вы хотите увеличивать количество узлов только при прокрутке вниз (сохраняя вертикальную полосу прокрутки видимой)? Или вам нужна сетка без полосы прокрутки, которая просто запоминает смещение и отображает только что выбранный небольшой блок (без вертикальной полосы прокрутки)?   -  person TLama    schedule 03.09.2015
comment
Я надеялся, что полоса прокрутки останется видимой, например, в sitepoint.com/demos/infinite -scrolling-demo4   -  person stephenwebber    schedule 03.09.2015
comment
Если у вас есть быстрый способ определения количества записей, вы можете установить количество узлов, используя его. Вам не нужно сразу загружать данные; вы можете использовать событие OnInitNode для ленивой загрузки записей по мере необходимости.   -  person Rob Kennedy    schedule 03.09.2015
comment
Как должна вести себя эта функция при изменении размера элемента управления (чтобы его вертикальная полоса прокрутки исчезла)?   -  person TLama    schedule 03.09.2015
comment
Лично меня это не беспокоит, поскольку размер моего элемента управления нельзя изменить.   -  person stephenwebber    schedule 03.09.2015


Ответы (1)


Вы можете обработать событие OnScroll и проверить, дошла ли полоса прокрутки до конца следующим образом:

type
  // this interposer class is used to publish the RangeY property
  TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
  public
    property RangeY;
  end;

procedure TForm1.VirtualStringTreeScroll(Sender: TBaseVirtualTree; DeltaX,
  DeltaY: Integer);
var
  Tree: TVirtualStringTree;
begin
  // if the vertical scroll occurred, then...
  if DeltaY <> 0 then
  begin
    // just a helper variable
    Tree := TVirtualStringTree(Sender);
    // if the client height without the top offset equals, or exceeds (actually, it should
    // never exceed; just for sure) the virtual tree height, then we reached the bottom of
    // the tree, so...
    if Tree.ClientHeight - Tree.OffsetY >= Integer(Tree.RangeY) then
    begin
      // the scrollbar reached the end of the tree; now fetch your data and add some nodes
      // (ideally as a thread task showing some fancy animation; the following is just for
      // example)
      ShowMessage('Fetch your data...');
      Tree.RootNodeCount := Tree.RootNodeCount + 50;
    end;
  end;
end;
person TLama    schedule 03.09.2015
comment
В обратном вызове OnResize вы можете вызвать ту же логику, что и в OnScroll (за исключением проверки DeltaY). Это позволяет поддерживать загрузку при изменении размера формы. - person stephenwebber; 03.09.2015