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 11-10-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
TreeView

Holas

Si seleciono un item de un TreeView se podria saber a que nivel pertenece, me podrian indicar como se haria por favor, gracias por adelantado.

-Opcion1 ->nivel1
----Opcion11 ->nivel2
----Opcion12 ->nivel2
-------Opcion121 ->nivel3
-------Opcion121 ->nivel3

Saludos y que tengan un bonito dia
Responder Con Cita
  #2  
Antiguo 11-10-2005
Gydba Gydba is offline
Miembro
 
Registrado: ene 2004
Ubicación: Argentina
Posts: 673
Poder: 21
Gydba Va por buen camino
Buenas,

No sé si es realmente lo que buscás, pero existe en ese componente la propiedad AbsoluteIndex propia del nodo que te especifica la posición absoluta dentro del tree.

Gracias por lo de bonito día, eso a pesar de estar dentro de una oficina
__________________
Suerte
.: Gydba :.
Responder Con Cita
  #3  
Antiguo 11-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Caro
se podria saber a que nivel pertenece
Nivel, en inglés se dice "Level". Los nodos tienen una propiedad llamada Level. Yo empezaría por ahí.

// Saludos
Responder Con Cita
  #4  
Antiguo 11-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Tambien puedes crearte un simple bucle, ahora no recuerdo si hay una propiedad para ello:

Código Delphi [-]
function GetLevel(node:TTreeNode):integer;
begin
  result := 0;
  while node <> nil do
  begin
    inc(result);
    node := node.parent;
  end;

saludos
Responder Con Cita
  #5  
Antiguo 11-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Salvo por una línea casi te sale igual al de la VCL

Código Delphi [-]
function TTreeNode.GetLevel: Integer;
var
  Node: TTreeNode;
begin
  Result := 0;
  Node := Parent;
  while Node <> nil do
  begin
    Inc(Result);
    Node := Node.Parent;
  end;
end;

// Saludos
Responder Con Cita
  #6  
Antiguo 11-10-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Muchas Gracias Gydba, roman y Lepe. Me funciono de la siguiente forma

En el evento Onclick del TreeView
Código Delphi [-]
         nivel:=TreeView.Items[TreeView.Selected.AbsoluteIndex].Level;
Responder Con Cita
  #7  
Antiguo 11-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Pero basta poner nivel:=TreeView.Selected.Level!

// Saludos
Responder Con Cita
  #8  
Antiguo 11-10-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Holas de nuevo,

Estuve probando el codigo que me pusiste Roman, pero me sale un error

Incompatible types TTreeNode and TWinControl

Código Delphi [-]
function TForm1.GetLevel: Integer;
var
  Node: TTreeNode;
begin
  Result := 0;
  Node := Parent;     //Aqui marca el error
  while Node <> nil do
  begin
    Inc(Result);
    Node := Node.Parent;
  end;
end;
Responder Con Cita
  #9  
Antiguo 11-10-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Me pacere mucho mejor como dices Roman

nivel:=TreeView.Selected.Level

Gracias de nuevo, pero aun me gustaria saber como funciona la funciòn que pusiste no la entiendo y como te dije arriba me marca un error.

Última edición por Caro fecha: 11-10-2005 a las 19:10:55.
Responder Con Cita
  #10  
Antiguo 11-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hay en mi tierra un dicho que dice: ¿Para qué tanto brinco estando el suelo tan parejo?

La propiedad que quieres es Level, no le des más vueltas.

AbsoluteIndex es el índice que el nodo tiene en el arreglo de nodos del TreeView sin contar indentación.

Entonces TreeView.Selected.AbsoluteIndex es el índice del nodo TreeView.Selected en el arreglo TreeView.Items. Por tanto

TreeView.Items[TreeView.Selected.AbsoluteIndex]

es lo mismo que TreeView.Selected y, por ende, innecesario.

El código que puse antes no te compila porque está fuera de contexto. Se trata del código del método GetLevel (para la propiedad Level) que forma parte del código de la clase TTreeNode donde Parent es otra cosa. Si tu pones ese código como parte de tu formulario, entonces Parent es otra cosa.

// Saludos
Responder Con Cita
  #11  
Antiguo 11-10-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por Roman
El código que puse antes no te compila porque está fuera de contexto. Se trata del código del método GetLevel (para la propiedad Level) que forma parte del código de la clase TTreeNode donde Parent es otra cosa. Si tu pones ese código como parte de tu formulario, entonces Parent es otra cosa.
Entonces: Parent es otra cosa = Parent es otra cosa, por lo que Parent es la misma cosa, El Parent , o sea, el que lo Contiene, solo que a unos los contiene un tipo y a otros otro tipo, es por eso lo del mensaje Incompatible types TTreeNode and TwinControl.



Mi padre es carpintero, se dedica a construir mesas, tu padre es albañil, se dedica a construir casas, la función DileaTuPadreQueMeHagaUnaMesa trabaja bien conmigo, pero no servirá contigo, a pesar que también tienes un padre.



Espero haberme explicado

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo


Última edición por yusnerqui fecha: 11-10-2005 a las 22:15:17.
Responder Con Cita
  #12  
Antiguo 11-10-2005
Migpal Migpal is offline
Miembro
 
Registrado: jul 2005
Ubicación: Colombia
Posts: 91
Poder: 19
Migpal Va por buen camino
Cita:
Empezado por yusnerqui
Mi padre es carpintero, se dedica a construir mesas, tu padre es albañil, se dedica a construir casas, la función DileaTuPadreQueMeHagaUnaMesa trabaja bien conmigo, pero no servirá contigo, a pesar que también tienes un padre.
Saludos
Todosfelices:=DileaTuPadreQueMeHagaUnaCasa(ConUnaMesa);

Responder Con Cita
  #13  
Antiguo 12-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Bueno, bueno, relanjense, ese código lo escribí yo (no roman) y no lo probé con delphi

Código Delphi [-]
function TForm1.GetLevel: Integer;
var
  Node: TTreeNode;
begin
  Result := 0;
  while Node <> nil do
  begin
    Inc(Result);
    Node := Node.Parent;
  end;
end;

He eliminado la linea del error, ya que tampoco hace falta.

Lo que hace, ya que estas interesado en saberlo, (cosa que me parece muyyyy bien) es:
- Primero verificamos que el nodo no es nil, si es nil significa que no tiene nodo padre (es un nodo root), por tanto salimos de la funcion devolviendo cero.
- Si tiene al menos un nivel de profundidad, entonces entra en el bucle, y va sumando 1; además buscamos el nodo padre del nodo que tenemos actualmente. Le paso un nodo por valor a la función, y dentro de la función lo modifico a voluntad (podría crear una variable temporal, pero de esta forma la ahorro). Tambien tiene inconvenientes, ya que el Nodo pasado por parámetro es un Objeto, y entonces se está pasando por referencia, así que si hacemos algo como esto:

Código Delphi [-]
var Nodo:TTreenode;
     nivel:integer;
begin
  nodo := Treeview1.Selected;
  nivel := getLevel(nodo);
  nodo.text := 'Si';<<<<<<<<<<<<<< aqui dará error en ejecución
end;
Porque dentro de la función hemos modificado el nodo. Si, se ha pasado por valor (no debería modificarse), pero nodo desciende de TObject, por tanto, se le pasa a la función un puntero, que si se modifica. Así que la función correcta sería:
Código Delphi [-]
function TForm1.GetLevel(nodo:TTreenode): Integer;
var
  temp: TTreeNode;
begin
  Result := 0;
  temp := nodo;
  while temp <> nil do
  begin
    Inc(Result);
    temp := temp.Parent;
  end;
end;

saludos, y por supuesto es node.Level lo que necesitas .
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 15:11:15.


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