2016-05-06 1 views
-2

Was ist das Problem mit dem folgenden Code. Es geht in einer EndlosschleifeWählen Sie alle untergeordneten Elemente von einem Knoten in der Baumansicht

for Itr := TreeView1.Items.Count-1 downto 0 do Begin 
    if TreeView1.Items[Itr].Selected then 
    begin 
    Node := TreeView1.Items[Itr]; 
    if (Node.Level = 0) and Node.HasChildren then begin 
    Sel_Node := Node.getNextSibling; 
     while Assigned(Sel_Node) do 
     begin 
      Sel_Node.Selected := True; 
      Sel_Node := Node.getNextSibling; 
     end; 
    end; 
    End; 
End; 

Antwort

1

Der Grund für die Endlosschleife ist in den beiden markierten Zeilen;

if (Node.Level = 0) and Node.HasChildren then 
    begin 
    Sel_Node := Node.getNextSibling; // here 
    while Assigned(Sel_Node) do 
    begin 
     Sel_Node.Selected := True; 
     Sel_Node := Node.getNextSibling; // and here 
    end; 
    end; 

Der Knoten Node bleibt gleich bei jeder Iteration, damit der Knoten Sel_Node ist auch das gleiche bei jeder Iteration und die Bedingung Assigned(Sel_Node) nie falsch wird. Vielleicht möchten wir Sie

 Sel_Node := Sel_Node.getNextSibling; 

im while Schleife schreiben?

Da der Header dieser Frage sagt "Wählen Sie alle untergeordneten Elemente von einem Knoten in treeview" Ich frage mich, warum Sie nur die Geschwisterknoten und nicht Kindknoten erhalten? Es ist nicht wirklich klar, was Sie zu erreichen versuchen.

Für ein Beispiel zum rekursiven Durchlaufen der Knoten können Sie sich auf this link beziehen.


bearbeiten nach Kommentare:

Mit TreeView1 Eigenschaften MultiSelect = True und MultiSelectStyle = [msControlSelect] und die rekursive Suche für Kinder und Geschwister Anwendung I verknüpft der Code, alle Kinder unter einem bereits ausgewählten Knoten mit level = 0 auszuwählen, sieht f .Ex. wie folgt aus:

procedure TForm1.SelectChildren(ANode: TTreeNode); 
begin 
    ANode := ANode.GetFirstChild; 
    if ANode = nil then Exit; 
    repeat 
    TreeView1.Select(ANode, [ssCtrl]); 
    SelectChildren(ANode); 
    ANode := ANode.getNextSibling; 
    until ANode = nil; 
end; 

procedure TForm1.Button5Click(Sender: TObject); 
var 
    Node: TTreeNode; 
begin 
    if (TreeView1.Selected <> nil) and 
    (TreeView1.Selected.Level <> 0) then Exit; 
    Node := TreeView1.Selected; 
    SelectChildren(Node); 
end; 
+0

möchte ich alle Kind von einem perticular Knoten auszuwählen programmatisch –

+0

Ich glaube, ich Ihre Frage beantwortet „* Was ist das Problem mit dem Code unten ist Sein in einer Endlosschleife * gehen.“. Ich habe auch einen Link zu einem Beispiel bereitgestellt, wie alle Kinder eines Treenodes rekursiv gefunden werden können. –

+0

Das war meine nächste Frage aber :) reparierte die unendliche Sache, aber die Multiselektion geschah nicht –