Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
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:
Código Delphi [-]
procedure LocalTreeListing(const Folder: String; Nodes: TTreeNodes);
var
    SearchRec: TSearchRec;
  i: Integer;
begin
  Nodes.Clear;

  SearchRec.ExcludeAttr := 32;
  if FindFirst(IncludeTrailingPathDelimiter(Folder)+'*.*', faAnyFile,
     SearchRec) = 0 then
      repeat
      if ((SearchRec.Attr and faDirectory) = faDirectory
         and not faHidden) and ((SearchRec.Attr and faSysFile) <> faSysFile) then
        Nodes.Add(nil,SearchRec.Name);
      {Elimina els items '.' i '..' si el FindFirst els crea}
      if  (Nodes.Count > 0) and
          ((Nodes[Nodes.Count-1].Text = '.') or
          (Nodes[Nodes.Count-1].Text = '..')) then
      Nodes[Nodes.Count-1].Delete;
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
end;
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?
__________________
l2prog.co.nr
Responder Con Cita
  #2  
Antiguo 03-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Puedes probar con este procedimiento:

Código Delphi [-]
procedure LocalTreeListing(const Folder: string; Nodes: TTreeNodes;
  ParentNode: TTreeNode);
var
  AFolder: TSearchRect;
  NewNode: TTreeNode;
 
begin
  if FindFirst(IncludeTrailingPathDelimiter(Folder) + '*.*', faDirectory, AFolder) = 0 then
    repeat
      if (AFolder.Name <> '.') and (AFolder.Name <> '..') then
      begin
        NewNode := Nodes.Add(ParentNode, AFolder.Name);
        LocalTreeListing(AFolder.Name, Nodes, NewNode)
      end
    until
      FindNext(AFolder) <> 0;
  FindClose(AFolder)
end;

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:
Código Delphi [-]
  MiTreeView.Items.Clear;
  LocalTreeListing('Windows', MiTreeView.Items, nil);
  // ...

Ya por último te comento que no probé este código, así que probablemente haya uno que otro error.


Saludos...
Responder Con Cita
  #3  
Antiguo 03-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
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...
Código Delphi [-]
procedure TreeListing(const Folder: string; Nodes: TTreeNodes;
  ParentNode: TTreeNode);
var
  AFolder: TSearchRec;
  NewNode: TTreeNode;
begin
  if FindFirst(IncludeTrailingPathDelimiter(Folder) + '*.*', faDirectory, AFolder) = 0 then
    repeat
      if ((AFolder.Attr and faDirectory) = faDirectory) and
         ((AFolder.Attr and faSysFile) <> faSysFile) and
         (AFolder.Name <> '.') and (AFolder.Name <> '..') then
      begin
        NewNode := Nodes.Add(ParentNode, AFolder.Name);
        TreeListing(IncludeTrailingPathDelimiter(CurrLocalPath+AFolder.Name) +
        '*.*', Nodes, NewNode);
      end;
    until
      FindNext(AFolder) <> 0;
  FindClose(AFolder);
end;
__________________
l2prog.co.nr
Responder Con Cita
  #4  
Antiguo 03-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.

Código Delphi [-]
procedure TreeListing(const Folder: string; Nodes: TTreeNodes;
  ParentNode: TTreeNode);
var
  AFolder: TSearchRec;
  NewNode: TTreeNode;
begin
  if FindFirst(IncludeTrailingPathDelimiter(Folder) + '*.*', faDirectory+ faAnyFile, AFolder) = 0 then
    repeat
      if ((AFolder.Attr and faDirectory) = faDirectory) and
         ((AFolder.Attr and faSysFile) <> faSysFile) and
         (AFolder.Name <> '.') and (AFolder.Name <> '..') then
      begin
        NewNode := Nodes.Add(ParentNode, AFolder.Name);
        TreeListing(IncludeTrailingPathDelimiter(CurrLocalPath+AFolder.Name) +
        '*.*', Nodes, NewNode);
      end;

      if ((AFolder.Attr and faAnyfile) = faAnyfile)) then
      // añadir el nodo de los archivos

    until
      FindNext(AFolder) <> 0;
  FindClose(AFolder);
end;

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.
Responder Con Cita
  #5  
Antiguo 03-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
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.
__________________
l2prog.co.nr
Responder Con Cita
  #6  
Antiguo 04-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Gunman
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...
Obviamente estas añadiendole tus errores al código que Maeyanes puso de memoria.... ¡¡ y que memoria !! solo tiene un par de detalles, que despues de ejecutar paso a paso se vé claramente.

Por cierto, no te ha ayudado a "depurar el código" sino a trabajar recursivamente.

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);

procedure TreeListing(const Folder: string; Nodes: TTreeNodes;
  ParentNode: TTreeNode);
var
  AFolder: TSearchRec;
  NewNode: TTreeNode;
begin
  if FindFirst(Folder + '*.*', faDirectory, AFolder) = 0 then
    repeat
      if ((AFolder.Attr and faDirectory) = faDirectory) and
         ((AFolder.Attr and faSysFile) <> faSysFile) and
         (AFolder.Name <> '.') and (AFolder.Name <> '..') then
      begin
        NewNode := Nodes.AddChild(ParentNode, AFolder.Name);
        TreeListing(IncludeTrailingPathDelimiter(Folder+AFolder.Name) +
        '*.*', Nodes, NewNode);
      end;
    until
      FindNext(AFolder) <> 0;
  FindClose(AFolder);
end;
begin
  TreeView1.Items.Clear;
  TreeListing(('c:\windows\'),TreeView1.Items,nil);
end;

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:34:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi