FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Función recursiva en un TreeView
Hola delphiadictos!
Estaba intentando crear una función que mostrase las carpetas de una unidad local en un TreeView. Yo habia hecho esto para experimetar un poco: Esto sólo inserta en el TreeView las carpetas de un directorio deseado y esto no me es suficiente. No tengo ni la mas mínima idea de por donde empezar con la función recursiva, alguien me podria hechar una mano? |
#2
|
|||
|
|||
Puedes probar con este procedimiento:
Si te fijas, cada que la búsqueda encuentra un directorio cuyo nombre no es '.' o '..', esta manda a llamar de nuevo al mismo procedimiento, enviando como parámetros el nombre del folder encontrado, la lista de nodos que estamos llenando y el nodo que se agregó, el cual será el padre de los nodos que se agreguen en la llamada recursiva. Para llamar al procedimiento debes hacer:
Ya por último te comento que no probé este código, así que probablemente haya uno que otro error. Saludos... |
#3
|
|||
|
|||
Gracias maeyanes, me has ayudado a depurar el código de mi procedimiento, pero la verdad es que este código hace exactamente lo mismo que hacia el mio, le he hecho unas modificaciones y se ha quedado así, pero sigue haciendo lo mismo que el mio...
Gracias de todas formas...
|
#4
|
||||
|
||||
Pedías una función recursiva... y eso tienes
Pensar en recursivo no es fácil, puedes tomarlo como primer paso para incluir los archivos.
Fijate que no hay else, esto es para que despues de añadir una carpeta, tambien intente añadir los archivos que haya. He puesto faAnyFile, tú ajustalo más a lo que quieras. saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#5
|
|||
|
|||
Lepe, gracias por tu interés, pero lo que yo quiero no es insertar archivos, mi TreeView sólo muestra carpetas.
Más o menos quiero que me quedé como el ShellTreeView. |
#6
|
||||
|
||||
Cita:
Por cierto, no te ha ayudado a "depurar el código" sino a trabajar recursivamente.
El primer detalle es que hay que usar AddChild para que los meta dentro. El segundo, es que al llamar a la función recursiva, hay que DARLE LA RUTA COMPLETA. Una "manía" mia, es que al llamar a FindFirst, no hace falta usar el includePathDelimiter, ya que siempre se le da la ruta con la barra al final. saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#7
|
||||
|
||||
Cita:
Se me pasó que el metodo para agregar nodos hijos es AddChild, como bien mencionas más a bajo. Cita:
Cita:
((AFolder.Attr and faSysFile) <> faSysFile) tal vez esté de más, ya que en la llamada a FindFirst se le está diciendo que solo busque carpetas. Cita:
|
#8
|
|||
|
|||
Perdón por estar tanto tiempo sin contestar...
He probado tu truco, Lepe, y funciona perfectamente, sólo hay un problemilla. Por ejemplo, si tengo esta carpeta: C:\Archivos de Programa\Archivos Comunes\Microsoft Shared ... y hago: Sólo me muestra lo siguiente: C:\ (<- esto no, es sólo para tener una referencia) Archivos de Programa Archivos Comunes (...) (...) Como podría hacer que se mostraran las carpetas dentro de Archivos comunes? |
#9
|
|||
|
|||
Vale, he avanzado algo... He estado jugando con la propiedad OnExpand del TreeView y se me ha ocurrido esto:
Ahora sólo hay un problema, al expandir una carpeta se añaden las carpetas y se muestra que se pueden expandir, perfecto, lo que yo queria, pero... ¡Se muestran las mismas carpetas dos veces! unas con la posibilidad de expandir y la otra no... No habria alguna forma de en vez de añadir un item substituirlo si este ya existe? |
#10
|
|||
|
|||
Hola, ya lo tengo casi... Esto es lo que he hecho:
Variables necesarias:
Procedimiento para añadir items al TreeView:
Procedimiento OnExpand del TreeView1:
...y para llamar-lo:
Bueno, ahora el problema está en que me hace una excepción en algunos casos: "List index out of bounds (0)" en la línia: [i]if (ParentNode.Item.Text = AFolder.Name) then en el procedimient AddFiles. Como puedo arreglar esto, no sé porqué hace este error... |
#11
|
||||
|
||||
Cosas como estas:
En otro sitio te dirían que vale, que no pasa nada. Desde luego, creo que en estos foros buscamos la eficiencia y el buen hacer de las cosas. Es innecesario crear los items, y acto seguirlo eliminarlo porque salen repetidos. Deberás hacer algo al respecto. En mi opinion, puedes añadir a la rutina recursiva, un parámetro FullDeep:Boolean, si lo pones a true, busca todos los niveles de carpeta, si lo pones a false, solo busca el nombre de las carpetas de primer nivel. Esto último te sirve para representar los nodos iniciales en el TreeView (FullDeep:=false), despues en el OnExpand, solo haz de llamar a la misma rutina con FullDeep:= True. saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#12
|
||||
|
||||
Función recursiva en un TreeView
Hey guys...somewhere I found a very good and effective algorithm you are trying I guess...
procedure DirectoryTree(Tree:TTreeView;Memo1:TMemo ; RootDirectory:string); var sr: TSearchRec; FileAttrs: Integer; theRootNode : tTreeNode; theNode : tTreeNode; procedure AddDirectories(theNode: tTreeNode; cPath: string); var sr: TSearchRec; FileAttrs: Integer; theNewNode : tTreeNode; begin FileAttrs := faAnyFile; //TSearchRec constant if FindFirst(cPath+'\*.*', FileAttrs, sr) = 0 then begin repeat if ((sr.Attr and FileAttrs) = sr.Attr) and (copy(sr.Name,1,1) <> '.') then begin theNewNode := Tree.Items.AddChild(theNode,sr.name); AddDirectories(theNewNode,cPath+'\'+sr.Name); end; until FindNext(sr) <> 0; FindClose(sr); end; end; begin FileAttrs := faAnyFile; //TSearchRec constant theRootNode := Tree.Items.AddFirst(nil,RootDirectory); if FindFirst(RootDirectory+'*.*', FileAttrs, sr) = 0 then begin theNode := Tree.Items.GetFirstNode; AddDirectories(theNode,RootDirectory+sr.Name); FindClose(sr); end; end; |
|
|
|