2012-08-27 25 views
5

Tüm kök düğümlerini veya tüm çocuk düğümlerini (VirtualTreeView'deki tüm düğümleri değil) seçmek istiyorum.
Bütün kök düğümlerini seçmek için bu kodu kullanmayı denedim:VirtualStringTree'deki tüm kök veya tüm çocuk düğümleri nasıl seçilir?

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; 

Ben küçük hata var söyleyebilir. Seçim ya eksik ya da takılıyor. Neyi yanlış yapıyorum ?

Düzenleme:
Ben multiselection kullanın.

+0

Çoklu seçim özelliği etkin. Bu, beni Node.States'i kullanmaya zorladı. Üzgünüm, daha önce belirtmiş olmalı. –

cevap

11

1. Seç tüm kök düğümleri:

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. Seç tüm alt düğümleri:

tüm kök düğüm seçmek için aşağıdaki yordamı kullanabilirsiniz

Tüm alt düğümleri, düzeyden bağımsız seçmek için recu kullanmanız gerekir. Böyle bir işlev:

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

Bir çekicilik gibi çalışır. Teşekkür ederim :) –