PDA

Ver la Versión Completa : TreeView parent


Caro
09-11-2005, 15:49:24
Hola a todos

Mi problema es el siguiente, quiero saber cual es el padre de cualquier nodo que yo seleccione (donde se encuantra osea su indice) de mi treview con parent del treview lo consigo hasta cierto punto por ejemplo digamos que mi treeview tiene lo siguiente


+-OP1
-Op11
+-Op12
-Op121
-Op122
+-Op2


Si hago click en OP1 todo bien me sale que tiene hijos
Si hago click en OP2 me sale error "Access Violation at address 004B6CE9 in module 'treeview.exe'" ya que no tiene hijos, no quiero que me salga ese error solo quiero que me indique que es un nodo raiz sin hijos
Otro problema que veo es que si yo hago click en Op121 me muestra que el padre es Op12 nose como le haria para que me muestre que existen 2 padres para Op121 que seria Op12 y OP1.

Lo estube haciendo de la siguiente manera


IF treeview.Selected.HasChildren=TRUE THEN
showmessage('Tiene Hijos')
ELSE
begin
showmessage('NO Tiene Hijos');
IF treeview.Selected.Parent.Count>0 THEN //Aqui Marca el Error
showmessage('el padre es '+treeview.Selected.Parent.Text+' esta en
la posiciòn '+ inttostr(treeview.Selected.Parent.AbsoluteIndex))
ELSE
showmessage('NO Tiene Hijos porque se encuentra como nodo raiz padre);
//no entra a este else
end;


Cualquier idea o sugerencia sera bienvenida, gracias por adelantado y que tengan un bonito dia.

roman
09-11-2005, 16:22:32
Parece que estás confundiendo dos cosas opuestas. Que un nodo tenga padre es completamente independiente de que tenga hijos. Para saber si un nodo tiene padre basta que verifiques que Node.Parent es distinto de nil. Para saber si tiene hijos basta que verifiques que Node.Count > 0.

Nunca hagas referencias a Node.Parent.Count si aún no has verificado que Node.Parent sea distinto de nil, ya que si lo es, tiendrás el "Access Violation".

// Saludos

Caro
09-11-2005, 16:42:28
Muchisimas gracias Roman mi primer problema solucionado pero aun no se me ocurre que cuando haga click en Op121 me muestra sus 2 padres correspondientes Op12 y OP1, alguna pequeña idea por donde empezar porfa, mi arbol podria tener muchos niveles eso quiere decir que un nodo que escoja podria tener muchos padres.

roman
09-11-2005, 16:51:09
Si lo que quieres saber son todos los padres de un nodo, es decir, padre, abuelo, bisabuelo etc. podrías usar un ciclo del estilo:


var
NodoPadre: TTreeNode;

begin
{
Aquí NodoPadre será el padre de ElNodo que te interese
}
NodoPadre := ElNodo.Parent;

{
Recorres la lista de padres hacia arriba en la jerarquía.
Cuando llegues a nil es que ya no hay padre y estás en la raíz
}
while NodoPadre <> nil do
begin
{
Haces lo que tengas que hacer con este padre
}

// Asciendes un nivel, tomando el padre del padre actual
NodoPadre := NodoPadre.Parent;
end;
end;


// Saludos

Caro
09-11-2005, 17:37:45
Mil Gracias Roman era lo que necesitaba.