Tema: TreeView
Ver Mensaje Individual
  #13  
Antiguo 12-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 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