Как надежно прокрутить Virtual TreeView до дна? - PullRequest
6 голосов
/ 15 мая 2010

Объект TVirtualStringTree с настраиваемой высотой узла. Как надежно прокрутить Virtual TreeView до дна (т. Е. Полоса прокрутки доходит до дна)?

Я пытался позвонить tree1.FullExpand, затем tree1.ScrollIntoView.(tree1.GetLast), но это не работает.

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 15 мая 2010

ScrollIntoView хорошо работает для меня. Вы также можете попробовать tree1.FocusedNode := tree1.GetLast;

Вы устанавливаете высоту пользовательского узла в событии OnMeasureItem? Если это не работает, попробуйте установить значение DefaultNodeHeight в дереве на большее значение, а в событии OnMeasureItem изменить его на меньшее. Я заметил, что дерево таким образом лучше пересчитывает длину полосы прокрутки.

4 голосов
/ 13 сентября 2012

Попробуйте это:

SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
1 голос

У меня была такая же проблема при работе с TVirtualDrawTree. Вы должны убедиться, что высота узла вычисляется до того, как дерево прокрутится.

Вот что я делаю:

1.- Добавьте этот код в событие OnInitNode, чтобы дерево знало, что высота нового узла должна быть вычислена:

Node.States := node.States + [vsMultiline] - [vsHeightMeasured];

2.- В OnMeasureItem, если вы не можете вычислить высоту (например, узел еще не инициализирован), убедитесь, что вы сказали дереву повторить вызов при необходимости: В обработчике события OnMeasureItem:

If (Node = Nil) Or (Node = tree.RootNode) Then Begin
  Exclude(Node.States, vsHeightMeasured);
  Exit;
End;

NodeData := tree.GetNodeData(Node);
If (NodeData = Nil) Or (NodeData^.XMLNode = Nil) Then Begin
  Exclude(Node.States, vsHeightMeasured);
  Exit;
End;
Try
  // Code to measure node height here.
Except
  Exclude(Node.States, vsHeightMeasured);
End;

Надеюсь, это поможет вам.

1 голос
/ 15 мая 2010

Это также должно работать:

tree1.TopNode := tree1.GetLast
...