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 ... как?
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 ... как?
Нет встроенных функций для расширения нескольких элементов или элементов на определенном уровне, поэтому нет другого пути прохождения предметов. Вызовите метод 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;
You должен всегда добавлять общий тег delphi к вашим связанным с delphi вопросам, чтобы иметь правильный синтаксический ярлык и больше внимания к вашему вопросу. –