/ / ¿Iterar recursivamente a través de nodos en una vista de árbol? - Delphi, recursión, vista de árbol, iteración

¿Iterar recursivamente a través de nodos en una vista de árbol? - Delphi, recursión, vista de árbol, iteración

Tengo una vista de árbol que ya está pobladaCon archivos / carpetas de otro procedimiento. Me gustaría iterar uno por uno a través de los elementos en la vista de árbol, yendo en el orden exacto de arriba a abajo. Sin embargo, a diferencia de una lista normal, no puedo usar un simple for declaración para esto. Tengo que entrar en cada nodo, etc.

¿Cómo hago esto? Espero que haya una manera de hacerlo sin ejecutar un procedimiento recursivo. A medida que recorro estos elementos, no me importan necesariamente los nodos padre o hijo del que está enfocado actualmente. Solo necesito poder leer el Data propiedad de cada nodo al pasarlos, así comoresalte el actual en la vista de árbol mientras lo paso. Para cada elemento en esta vista de árbol, estaré realizando algunos trabajos y quiero mostrarle al usuario cuál de ellos está seleccionado actualmente durante este proceso.

Respuestas

16 para la respuesta № 1

De hecho puedes usar un for lazo.

var
Node: TTreeNode;
....
for Node in TreeView.Items do
DoSomething(Node);

Este es el azúcar sintáctico para:

for i := 0 to TreeView.Items.Count-1 do
DoSomething(TreeView.Items[i]);

En términos de legibilidad recomendaría la for/in lazo.

En versiones anteriores de Delphi que no admiten el iterador de nodos, puede preferir hacerlo con un while lazo.

Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
DoSomething(Node);
Node := Node.GetNext;
end;

Espero que haya otras formas de hacerlo. ¡Estos son los únicos que conozco!


LU RD hace la interesante observación de que el documentación estados:

Acceder a los elementos de la vista de árbol por índice puede serrequiere mucho tiempo, especialmente cuando la vista de árbol contiene muchos elementos. Para obtener un rendimiento óptimo, intente diseñar su aplicación para que tenga la menor cantidad de dependencias posible en el índice de elementos de la vista de árbol.

Esto es bastante cierto. Para el acceso aleatorio, el código tiene que caminar por el árbol, comenzando en la raíz, hasta que ith Se localiza el nodo.

Sin embargo, hay una optimización para secuencial.acceso. El contenedor de la vista de árbol de Delphi recuerda el índice del último nodo ubicado por índice. La próxima vez que solicite un nodo con un índice no más diferente del nodo almacenado en la memoria caché, el nodo requerido se puede devolver rápidamente. Esto se implementa en TTreeNodes.GetNodeFromIndex.


3 para la respuesta № 2
var
i:Integer;
begin
for I := 0 to tv.Items.Count - 1 do
begin
Listbox1.Items.Add(tv.Items[i].Text +" SubItems: " + IntToStr(tv.Items[i].Count))
end;

end;