Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #2  
Antiguo 03-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 22
[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
  #3  
Antiguo 04-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #4  
Antiguo 06-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Cita:
Empezado por Lepe
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.
Y como te darás cuenta, la memoria me falló... jejeje

Se me pasó que el metodo para agregar nodos hijos es AddChild, como bien mencionas más a bajo.

Cita:
Empezado por Lepe
Por cierto, no te ha ayudado a "depurar el código" sino a trabajar recursivamente.
Así es, además que le quité cierto código que sentí estaba de más, mi intención primera era mostrarle como hacer un procedimiento recursivo.

Cita:
Empezado por Lepe
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;
Otro detalle, esta comprobación: ((AFolder.Attr and faDirectory) = faDirectory) and
((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:
Empezado por Lepe

saludos
Saludos...
Responder Con Cita
  #5  
Antiguo 23-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 22
[Gunman] Va por buen camino
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:
Código Delphi [-]
TreeListing('c:\',TreeView1.Items,nil);
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?
__________________
l2prog.co.nr
Responder Con Cita
  #6  
Antiguo 23-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 22
[Gunman] Va por buen camino
Vale, he avanzado algo... He estado jugando con la propiedad OnExpand del TreeView y se me ha ocurrido esto:
Código Delphi [-]
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
begin
  CurrentDir := CurrentDir+Node.Text+'\';
  TreeListing(CurrentDir,TreeView1.Items,Node);
end;
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?
__________________
l2prog.co.nr
Responder Con Cita
  #7  
Antiguo 24-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 22
[Gunman] Va por buen camino
Hola, ya lo tengo casi... Esto es lo que he hecho:

Variables necesarias:
Código Delphi [-]
 var
   MainFrm: TMainFrm;
   CurrentDir, FirstPath: String;

Procedimiento para añadir items al TreeView:
Código Delphi [-]
 procedure AddFiles(const Folder: string; Nodes: TTreeNodes;
   ParentNode: TTreeNode);
 var
   AFolder: TSearchRec;
   NewNode: TTreeNode;
   i: Integer;
 begin
   if FindFirst(Folder + '*.*', faDirectory, AFolder) = 0 then
   repeat
     if (AFolder.Name <> '.') and (AFolder.Name <> '..') then
     begin
       if ParentNode <> nil then
       begin
         for i := 0 to ParentNode.Count-1 do
        [i] if (ParentNode.Item.Text = AFolder.Name) then
         begin
           ParentNode.Item[i].Delete;
         end;
       end;
       NewNode := Nodes.AddChild(ParentNode, AFolder.Name);
       AddFiles(IncludeTrailingPathDelimiter(Folder+AFolder.Name) +
                 '*.*', Nodes, NewNode);
     end;
   until FindNext(AFolder) <> 0;
   FindClose(AFolder);
 end;

Procedimiento OnExpand del TreeView1:
Código Delphi [-]
 procedure TMainFrm.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
   var AllowExpansion: Boolean);
 var
   i: Integer;
 begin
   CurrentDir := FirstPath;
   for i := Node.Level downto 0 do
   if i = 0 then
   CurrentDir := CurrentDir+Node.Text+'\'
   else
   CurrentDir := CurrentDir+Node.Parent.Text+'\';
   ShowMessage(CurrentDir);
   AddFiles(CurrentDir,TreeView1.Items,Node);
 end;

...y para llamar-lo:
Código Delphi [-]
 procedure TMainFrm.NewRegisterClick(Sender: TObject);
 begin
   TreeView1.Items.Clear;
   AddFiles('E:\Mis Documentos\Mis archivos recibidos\', TreeView1.Items, nil);
   FirstPath := ('E:\Mis Documentos\Mis archivos recibidos\');
 end;

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...
__________________
l2prog.co.nr
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 05:36:14.


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