PDA

Ver la Versión Completa : Un TTreeView que no funciona como quiero


Angel.Matilla
10-05-2018, 11:31:44
https://image.ibb.co/euzuJy/Pantalla.jpg
Tengo ese formulario. Es evidente que a la izquiera hay un TTreeView; la parte de la derecha es un TPanel que contiene la información. Tengo este código en el evento OnGetSelectedIndex del TTreeView:
PageControl2->ActivePageIndex = -1;
Panel1->Visible = !Node->HasChildren;
if (!Node->HasChildren)
{
PageControl2->ActivePageIndex = 0;
PageControl2Change(NULL);
}Al menos a mi me parece evidente que si el nodo seleccionado tiene descendientes el panel de la derecha no debería mostrarse, pero como podéis ver en la imagen no sólo se muestra sino que además la información no tiene nada que ver con el nodo seleccionado. ¿Alguna sugerencia?

Casimiro Notevi
10-05-2018, 11:39:02
Panel1->Visible = !Node->HasChildren;Cuando el nodo no tenga hijos, que se muestre. ¿No será al revés? ¿ese es el comportamiento que deseas?

Ñuño Martínez
10-05-2018, 11:40:33
Creo que lo has hecho al revés. Es decir:

Panel1->Visible = !Node->HasChildren; // Panel1 es Visible si NO (Node tiene hijos).

Debería ser:

Panel1->Visible = Node->HasChildren; // Panel1 es Visible si Node tiene hijos.

Al menos eso creo, por lo que dices.

[edit]
Empate, Casimiro.

Angel.Matilla
10-05-2018, 12:17:52
No, es correcto. El panel con la información debe mostrarse cuando el nodo seleccionado no tenga hijos. En la imagen que he puesto el orden de los nodos es:
Partido Judicial > Comarca > MunicipioEs evidente que la información detallada es a nivel de municipio; en el resto de los casos no hay nada que mostrar porque en todo caso sería un resumen de lo que cuelga de ese nodo.

Parte del problema lo he resuelto en parte. Estaba creando el árbol con AddObjects /AddChlidObjects en vez con Add / AddChild y estaba cometiendo el error de introducir en los niveles superiores un valor en el objeto. Al ejecutar el query para sacar la información arrastraba un código que es el que produce esos resultados absurdos. Sin embargo a pesar de haber solucionado este problema cuando cargo el arbol se me muestra siempre el panel hasta que empiezo a recorrerlo.

ecfisa
10-05-2018, 13:46:17
Hola.

El evento no es el adecuado, usa el mismo código en el evento OnChange del TTreeView.

Saludos :)

Angel.Matilla
10-05-2018, 19:38:04
Gracias por las respuestas. Al menos de momento he desistido de usar un TTreeView y he pasado a usar un TListView; es menos elegante, pero hasta que no vea porqué no funciona como yo quiero lo dejo aparcado.
El evento no es el adecuado, usa el mismo código en el evento OnChange del TTreeView.

Pero para poder usar ese código en el OnChange, antes tendré que saber que ítem tengo seleccionado y eso si no me equivoco se "descubre" en donde ahora lo tengo puestp. Corregidme si estoy errado.

ecfisa
10-05-2018, 20:13:50
Hola.

...
Pero para poder usar ese código en el OnChange, antes tendré que saber que ítem tengo seleccionado y eso si no me equivoco se "descubre" en donde ahora lo tengo puestp. Corregidme si estoy errado.
Pero... ¿ lo has probado y no funciona o solo conjeturas que no lo hace ?


void __fastcall TTu_Form::Tu_TreeViewChange(TObject *Sender, TTreeNode *Node)
{
// Aquí Node es el actualmente seleccionado
Panel1->Visible = !Node->HasChildren;
}


Muestra del comportamiento con tus datos:
https://s14.postimg.cc/fqljebl9t/AMatilla_06.gif

Saludos :)

Angel.Matilla
11-05-2018, 09:44:32
Pero... ¿ lo has probado y no funciona o solo conjeturas que no lo hace ?
No, no son conjeturas; está probado.

ecfisa
11-05-2018, 16:50:17
Hola.

Bueno, como queda demostrado en el ejemplo y video anterior, no hay que saber con antelación que ítem está seleccionado; el parámetro Node del evento OnChange apunta al nodo actualmente seleccionado.

Saludos :)

Angel.Matilla
11-05-2018, 17:33:58
Bueno, como queda demostrado en el ejemplo y video anterior, no hay que saber con antelación que ítem está seleccionado; el parámetro Node del evento OnChange apunta al nodo actualmente seleccionado.
Pues tenéis toda la razón; no me lo había planteado así. Volveré a probar.