Данные алгоритмы не рекурсивны, как возможно стоило бы сделать. Но в компоненте TTreeView есть ряд готовых методов, которыми можно просто пользоваться. В данном случае, мы опираемся на метод GetNext, который дает нам всегда следующий узел, независимо от уровня.
Пусть есть дерево TTreeView. Вот простой способ обойти все дерево.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
procedure TPSDBTreeExplorerCheckboxes.CheckAllVisibleChildren(Node:TTreeNode); var startLevel: integer; TempNode: TTreeNode; begin with (FMainFrame as TPSDBTreeExplorerMainFrame).TreeView do begin startLevel:=Node.Level; TempNode:=Node; repeat TempNode.StateIndex:=2; // set check box to true TempNode:=TempNode.GetNext; until (not Assigned(TempNode)); end; end; |
Обход самого узла и всех детей конкретного узла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TPSDBTreeExplorerCheckboxes.CheckAllVisibleChildren(Node:TTreeNode); var startLevel: integer; TempNode: TTreeNode; begin with (FMainFrame as TPSDBTreeExplorerMainFrame).TreeView do begin startLevel:=Node.Level; TempNode:=Node; repeat TempNode.StateIndex:=2; // set check box to true TempNode:=TempNode.GetNext; until (not Assigned(TempNode)) or (TempNode.Level<=StartLevel); end; end; |