カスタムノードの高さを持つTVirtualStringTreeオブジェクト、Virtual TreeViewを確実に一番下までスクロールする(つまり、スクロールバーが一番下になる)方法は?
その時電話してみtree1.FullExpandましtree1.ScrollIntoView.(tree1.GetLast)たが、うまくいきません。
前もって感謝します。
カスタムノードの高さを持つTVirtualStringTreeオブジェクト、Virtual TreeViewを確実に一番下までスクロールする(つまり、スクロールバーが一番下になる)方法は?
その時電話してみtree1.FullExpandましtree1.ScrollIntoView.(tree1.GetLast)たが、うまくいきません。
前もって感謝します。
ScrollIntoViewは私にとってうまく機能します。また、試すことができますtree1.FocusedNode := tree1.GetLast;
OnMeasureItemイベントでカスタムノードの高さを設定していますか?それが機能しない場合は、ツリーのDefaultNodeHeightをより大きな値に設定し、OnMeasureItemイベントでそれをより低い値に変更してみてください。ツリーがスクロールバーの長さをより適切に再計算することに気づきました。
これを試して:
SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
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;
お役に立てば幸いです。
これも機能するはずです:
tree1.TopNode := tree1.GetLast