Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-08-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 19
FerCastro Va por buen camino
Recorrer tree

Hola al foro

Tengo un tree y necesito recorrerlo para buscar los elementos que contiene. Estoy haciendo un procedimiento recursivo pero no consigo salir. bueno si salgo pero no recorro el árbol, me quedo en el primer nodo y de ahi no salgo.

Alguien ha hecho algo parecido que pudiera echarme una mano? agradezco la ayuda de antemano.

FCG
México
Responder Con Cita
  #2  
Antiguo 09-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,
deberias recorrer la propiedad Items tal cual, no hace falta recursividad:

Código Delphi [-]

Memo1.Clear;
for i := 0 to treeview1.Count - 1 do
Memo1.Add(Treeview1.Items[i].Text);
Responder Con Cita
  #3  
Antiguo 09-08-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 19
FerCastro Va por buen camino
Hola Coso

Déjame te explico lo que quiero hacer:

Tengo un arbol el cual representa la estructura de una empresa, los nodos son departamentos y los hijos de estos son los empleados, y cada departamento puede a su vez tener departamentos anidados.

Lo que quiero hacer es buscar dentro de un departamento todos los empleados que contiene, incluidos los empleados que pudieran estar dentro de los departamentos que son hijos del departamento padre..

Ahora, no siempre inicio el recorrido en el nodo principal.

Espero haber sido claro.

FCG
Responder Con Cita
  #4  
Antiguo 09-08-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 19
felipe88 Va por buen camino
Hola,
Teniendo en cuenta que generalmente hay un nodo seleccionado, a partir de ahi seria el despliegue que necesitas; probando algo asi
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var p, i:Integer;
begin
  for p:=TreeView1.Selected.Index to TreeView1.Items.Count - 1 do
    begin
      Memo1.Lines.Add(TreeView1.Items[p].Text);
    end;
end;
Solo restaria determinar el valor a detenerse, el cual tendria el siguiente nodo padre, siguiendo este orden:

Cita:
padre1
hijo1
hijo2
padre2 // Aca deberia detenerse el for.
hijo1
hijo2
Desconozco si cada nodo padre tenga su propio valor unico, de este modo no seria necesario implementar el for, y creo que lograrias lo que necesitas.
__________________
Web
Responder Con Cita
  #5  
Antiguo 09-08-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 19
FerCastro Va por buen camino
Hola Felipe.

El esquema es asi:

- Departamento Padre
- Departamento Uno
- Empleado
- Empleado
- Empleado
- Departamento Dos
- Empleado
- Empleado
- Departamento Tres
- Empleado
- Empleado
---- Departamento Cuatro
---- Empleado
---- Empleado

Por ejemplo, si elijes al departamento uno podríamos decir que es sencillo, pues solo haces el recorrido de los elementos del nodo elegido y todos serán empleados. Pero, si elijes el departamento 3 CREO que necesitas un procedimiento recursivo el cual seleccionará los elementos empleado del departamento tres, pero cuando encuentre que dentro de ese departamento existe otro departamento el proceso debe iniciar de nuevo, no?

No se si la recursividad sea forzosa para recorrer un tree, quiero creer que si.

Alguna idea?

Saludos y gracias

- Ya posteado no se nota, pero el departamento 4 está contenido dentro del departamento 3. Parece que no respeta espacios.

Última edición por FerCastro fecha: 09-08-2008 a las 17:38:26. Razón: tuve que agregar caracteres extra al inicio de unos renglones para simular un arbol
Responder Con Cita
  #6  
Antiguo 09-08-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 19
felipe88 Va por buen camino
Bueno, creo que es una buena solucion lo del procedimiento recursivo; pero a lo que yo me refiero es exactamente a lo que me dices
Cita:
Empezado por FerCastro
pero cuando encuentre que dentro de ese departamento existe otro departamento el proceso debe iniciar de nuevo, no?
entonces, ¿como determinamos que existe un nivel menor (hijo) o mayor (padre)?, no estoy muy seguro de como obtener esto (Parent, Children), de primera mano se me ocurre una condicion que al cumplirse ejecute de nuevo el procedimiento (Recursividad).
__________________
Web
Responder Con Cita
  #7  
Antiguo 09-08-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 19
FerCastro Va por buen camino
Listo, problema corregido

La recursividad funcionaba bien, lo que estaba utilizando mal era un método del objeto Nodo.

Agradezco la ayuda prestada y si alguien desea saber cómo lo hice con todo gusto lo aclaro.

Saludos!!

FCG
Responder Con Cita
  #8  
Antiguo 09-08-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 19
felipe88 Va por buen camino
Bueno, pues que bien... que esperas para compartirla
__________________
Web
Responder Con Cita
  #9  
Antiguo 09-08-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 19
FerCastro Va por buen camino
Recursividad en el tree

- Aclaro, cuando creo el árbol identifico los empleados con ':.' al inicio del nombre, se que es no es una solución muy ortodoxa, y si alguien tiene una mejor le agradeceré me la haga saber.

No pongo el código de cuando mando el empleado a una tabla virtual y al grid, pues esto solo aplica a mi programa.

Si alguien quiere que le amplíe la explicación, o si alguien simplifica el código con todo gusto las sugerencias y preguntas son bienvenidas. Está comentado pero pudierab haber omitido algunos detalles.

Saludos!!


FCG




Código Delphi [-]



// la función recibe como parametro un nodo, que inicialmente es el nodo elegido al principio.

function TFReporte.TomaNodos(oNodo:TTreeNode): integer;
var
  nCiclo: Integer;
  cNombre: string;
  nPos: Integer;
  oNodoHijo : TTreeNode;
  nLargo: Integer;
  bEncuentra: Boolean;
  Begin

    // con este ciclo for recorremos todos los elementos del nodo que entra como parámetro
    for nCiclo := 0 to oNodo.Count - 1 do
      Begin
            // tomamos el nodo que corresponde a la posición que indica el ciclo
            oNodoHijo := oNodo.Item[nCiclo];

            // Vamos a verificar si el nodo elegido es empleado
            cNombre := oNodoHijo.Text;
            nPos:=Pos(':.',cNombre);

            // Si el nodo es un empleado, o para cualquier ejemplo práctico, si no es nodo padre dentro de un nodo padre
            if nPos > 0 then
              Begin

                // Mandar el empleado al grid


                  end;
              End
            // De lo contrario el nodo es un departamento, o es un nodo padre dentro de un nodo padre
            Else
              Begin
                 // La función se llama así misma con un nuevo parámetro, ahora el nuevo nodo que puede contener hijos dentro de otro nodo.
                 TomaNodos(oNodoHijo);
              End ;

      End;

  End;

Última edición por FerCastro fecha: 09-08-2008 a las 18:31:13. Razón: Me faltó explicar algunas cosas
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Shell tree view apolyon Varios 1 02-06-2008 20:26:53
Virtual Tree walrus OOP 3 24-11-2006 18:54:37
Grid con Tree cricri2999 OOP 3 11-08-2006 11:21:17
tree view danielsalazar Varios 1 08-09-2005 17:54:19
Tree View (problemas) jymy788 Varios 3 19-08-2004 17:14:29


La franja horaria es GMT +2. Ahora son las 01:53:40.


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