Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Un TTreeView que no funciona como quiero (https://www.clubdelphi.com/foros/showthread.php?t=93076)

Angel.Matilla 10-05-2018 12:31:44

Un TTreeView que no funciona como quiero
 

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:
Código PHP:

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 12:39:02

Código Delphi [-]
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 12:40:33

Creo que lo has hecho al revés. Es decir:
Código:

  Panel1->Visible = !Node->HasChildren; // Panel1 es Visible si NO (Node tiene hijos).
Debería ser:
Código:

  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 13: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:
Cita:

Partido Judicial > Comarca > Municipio
Es 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 14: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 20: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.
Cita:

Empezado por ecfisa (Mensaje 526208)
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 21:13:50

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 526217)
...
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 ?

Código PHP:

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


Muestra del comportamiento con tus datos:


Saludos :)

Angel.Matilla 11-05-2018 10:44:32

Cita:

Empezado por ecfisa (Mensaje 526223)
Pero... ¿ lo has probado y no funciona o solo conjeturas que no lo hace ?

No, no son conjeturas; está probado.

ecfisa 11-05-2018 17: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 18:33:58

Cita:

Empezado por ecfisa (Mensaje 526246)
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.


La franja horaria es GMT +2. Ahora son las 15:35:02.

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