2010-05-15 47 views
5

具有自定義節點高度的TVirtualStringTree對象,如何可靠地將虛擬TreeView滾動到底部(即滾動條到達底部)?如何可靠地將虛擬TreeView滾動到底部?

我試過打電話tree1.FullExpand,然後tree1.ScrollIntoView.(tree1.GetLast),但它不起作用。

預先感謝您。

回答

5

ScrollIntoView適合我。您也可以嘗試tree1.FocusedNode := tree1.GetLast;

您是否在OnMeasureItem事件中設置自定義節點高度? 如果它不起作用,請嘗試將樹的DefaultNodeHeight設置爲較大的值,並在OnMeasureItem事件中將其更改爲較低值。我注意到樹會更好地重新計算滾動條的長度。

+0

感謝利納。是的,我在節點內容的OnMeasureItem事件基礎上爲每個節點設置自定義高度。設置'tree1.FocusedNode'不起作用。我會嘗試你所說的關於設置所有節點的大高度然後調整值。 – 2010-05-15 19:26:51

+0

嗨Linas, 你建議的第二種方法的作品!虛擬樹視圖在滾動操作期間進行計算時似乎使用DefaultNodeHeight。 – 2010-05-15 19:43:34

+0

這是正確的,埃德溫。另一種方法是讓控制器初始化樹中的每個節點,即使是那些尚未可見的節點。這可能是耗時的。 – 2010-05-16 05:39:12

1

這也應該工作:

tree1.TopNode := tree1.GetLast 
+0

感謝Straveu。它也不起作用... PS。如果手動(不是以編程方式)向下滾動到最後一個節點,我可以完成樹形視圖的打印。 – 2010-05-15 19:32:29

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; 

我希望它可以幫助你。

4

試試這個:

SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0); 
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);