2012-08-27 167 views
5

我想選擇所有的根節點或所有的子節點(並非VirtualTreeView中的所有節點)。
我試圖用這個代碼來選擇所有根節點:如何選擇VirtualStringTree中的所有根節點或所有子節點?

procedure SelectAllRoots; 
var 
    Node: PVirtualNode; 
begin 
    Form1.VirtualStringTree1.BeginUpdate; 
    Node := Form1.VirtualStringTree1.GetFirst; 
    while True do 
    begin 
    if Node = nil then 
     Break; 
    if not (vsSelected in Node.States) then 
     Node.States := Node.States + [vsSelected]; 
    Node := Form1.VirtualStringTree1.GetNext(Node); 
    end; 
    Form1.VirtualStringTree1.EndUpdate; 
end; 

我可以告訴大家有一個小故障。 選擇不完整或卡住。我究竟做錯了什麼 ?

編輯:
我使用MultiSelection。

+0

我有多選擇屬性啓用。這有點迫使我使用Node.States。對不起,以前應該提到過。 –

回答

11

1.選擇所有根節點:

要選擇所有根節點,您可以使用以下方法:

procedure SelectRootNodes(AVirtualTree: TBaseVirtualTree); 
var 
    Node: PVirtualNode; 
begin 
    AVirtualTree.BeginUpdate; 
    try 
    Node := AVirtualTree.GetFirst; 
    while Assigned(Node) do 
    begin 
     AVirtualTree.Selected[Node] := True; 
     Node := AVirtualTree.GetNextSibling(Node); 
    end; 
    finally 
    AVirtualTree.EndUpdate; 
    end; 
end; 

2.選擇所有子節點:

要選擇所有級別獨立的子節點,您需要使用recu rsive功能是這樣的:

procedure SelectChildNodes(AVirtualTree: TBaseVirtualTree); 
var 
    Node: PVirtualNode; 

    procedure SelectSubNodes(ANode: PVirtualNode); 
    var 
    SubNode: PVirtualNode; 
    begin 
    SubNode := AVirtualTree.GetFirstChild(ANode); 
    while Assigned(SubNode) do 
    begin 
     SelectSubNodes(SubNode); 
     AVirtualTree.Selected[SubNode] := True; 
     SubNode := AVirtualTree.GetNextSibling(SubNode); 
    end; 
    end; 

begin 
    AVirtualTree.BeginUpdate; 
    try 
    Node := AVirtualTree.GetFirst; 
    while Assigned(Node) do 
    begin 
     SelectSubNodes(Node); 
     Node := AVirtualTree.GetNextSibling(Node); 
    end; 
    finally 
    AVirtualTree.EndUpdate; 
    end; 
end; 
+1

工程就像一個魅力。謝謝 :) –

相關問題