Jump to content


Photo

Eliminando Hijos de un nodo padre en TreeView


  • Please log in to reply
4 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 07 May 2016 - 01:22 PM

Pues esto, estoy tratando de eliminar todos los nodos hijos de un nodo padre en un Treeview, primera vez que me sucede con este problema, en el código recorro todos los nodos y verifico si es un nodo padre y tiene hijos entonces procedo a eliminarlos, pero me da un error extraño de "Invalid Index", pero aún así me elimina todos los hijos sin problema, dejo el código para que me echen una manita a ver en qué estoy fallando:


delphi
  1. procedure cleanTreeNodes(Tree: TTreeView);
  2. var p,h: integer;
  3. begin
  4. for p := 0 to Tree.Items.Count -1 do
  5. begin
  6. if (Tree.Items[p].Parent = nil) And (Tree.Items[p].Count > 0) then
  7. for h := 0 to Tree.Items[p].Count -1 do
  8. Tree.Items[p].DeleteChildren;
  9. end;
  10. end;

Saludos.


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 07 May 2016 - 02:48 PM

En lugar de recorrer desde el 0 a count recorre en sentido inverso, desde Count a 0.

Parecerá tonto pero en realidad se debe a que cuando se está eliminando items se debe ir "recalculando" la cantidad de elementos sobrantes.

 

Saludos,


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 07 May 2016 - 03:06 PM

Pues no es tonto, ¡ya lo había intentado! y el resultado es el mismo, de todos modos lo acabo de solucionar de otro modo, y es alojando el índice del nodo en una variable privada y el procedimiento se encarga de borrar los hijos a través de un índice dado, en este caso la variable global privada, el procedimiento queda así:


delphi
  1. procedure cleanTreeNodes(Tree: TTreeView; Index: Integer);
  2. begin
  3. if (Tree.Items[Index].Parent = nil) And (Tree.Items[Index].Count > 0) then
  4. Tree.Items[Index].DeleteChildren;
  5. end;

Así que es más corto y menos forzado, de todos modos espero variantes a ver si me saca la duda del anterior código.

 

Saludos.


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 07 May 2016 - 09:37 PM

Hola amigo, 

 

Y si borras siempre el primero ??? es decir, sin recorrer el treeview.

 

Saludos


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 08 May 2016 - 09:25 AM

Pues el primero es el nodo padre, y ese no se elimina, sólo sus hijos (Un padre de esos calentudos tienen más de un hijo ¿no?) y quede el padre sólo.


  • 0




IP.Board spam blocked by CleanTalk.