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
.