2014-12-08 9 views
0

Ex .:как расширить только на втором уровне TreeView

 
    - link 1 
    -- link 1.1 
    --- link 1.1.1(only) 
    ---- link 1.1.1.1 (not expand) 
    -- link 1.2 
    --- link 1.2.1 (only) 
    ---- link 1.2.1.1 (not expand) 

можно расширить только ссылку 1.1, ссылку 1.2 ... как?

+1

You должен всегда добавлять общий тег delphi к вашим связанным с delphi вопросам, чтобы иметь правильный синтаксический ярлык и больше внимания к вашему вопросу. –

ответ

2

Нет встроенных функций для расширения нескольких элементов или элементов на определенном уровне, поэтому нет другого пути прохождения предметов. Вызовите метод Expand на всех элементах второго уровня. Также на всех элементах первого уровня, иначе предметы второго уровня не будут показаны. Его параметр Recurse должен быть False, чтобы не расширять, возможно, третий или более глубокий уровень.

Существует два способа перемещения по элементам TreeView: по индексу элемента и по узлу. Обычно операции над элементами TreeView предпочтительно выполняются с помощью Node, поскольку геттер свойства Items проходит через все элементы, чтобы найти один элемент с определенным индексом. Однако TTreeNodes кэширует последний извлеченный элемент, таким образом, увеличивая индекс цикла на 1, вред будет сведен к минимуму.

Простое решение становится:

procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer); 
var 
    I: Integer; 
begin 
    Nodes.BeginUpdate; 
    try 
    for I := 0 to Nodes.Count - 1 do 
     if Nodes[I].Level < Level then 
     Nodes[I].Expand(False); 
    finally 
    Nodes.EndUpdate; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ExpandTreeNodes(TreeView1.Items, 2); 
end; 

Обратите внимание, что добытчик в Items отеле по-прежнему называется дважды. Несмотря на механизм кэширования, я думаю, что это все-таки следует избегать:

procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer); 
var 
    I: Integer; 
    Node: TTreeNode; 
begin 
    Nodes.BeginUpdate; 
    try 
    for I := 0 to Nodes.Count - 1 do 
    begin 
     Node := Nodes[I]; 
     if Node.Level < Level then 
     Node.Expand(False); 
    end; 
    finally 
    Nodes.EndUpdate; 
    end; 
end; 

Но вы можете также использовать:

procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer); 
var 
    Node: TTreeNode; 
begin 
    Nodes.BeginUpdate; 
    try 
    Node := Nodes.GetFirstNode; 
    while Node <> nil do 
    begin 
     if Node.Level < Level then 
     Node.Expand(False); 
     Node := Node.GetNext; 
    end; 
    finally 
    Nodes.EndUpdate; 
    end; 
end; 

Это все еще проходит через все элементы. Хорошо, только один раз. Но если у вас есть действительно большие и/или глубокое дерево, и вы хотите добиться максимальной эффективности, и вы не заботитесь о читаемости, или вы просто хотите поэкспериментировать с узлами TreeView для удовольствия, а затем использовать:

procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer); 
var 
    Node: TTreeNode; 
    Next: TTreeNode; 
begin 
    if Level < 1 then 
    Exit; 
    Nodes.BeginUpdate; 
    try 
    Node := Nodes.GetFirstNode; 
     while Node <> nil do 
     begin 
     Node.Expand(False); 
     if (Node.Level < Level - 1) and Node.HasChildren then 
      Node := Node.GetFirstChild 
     else 
     begin 
      Next := Node.GetNextSibling; 
      if Next <> nil then 
      Node := Next 
      else 
      if Node.Level > 0 then 
       Node := Node.Parent.GetNextSibling 
      else 
       Node := Node.GetNextSibling; 
     end; 
     end; 
    finally 
    Nodes.EndUpdate; 
    end; 
end; 
Смежные вопросы