Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Comportamiento extraño de TVirtualStringTree (https://www.clubdelphi.com/foros/showthread.php?t=95778)

Angel.Matilla 04-08-2022 12:27:24

Comportamiento extraño de TVirtualStringTree
 
Me está ocurriendo algo que no soy capaz de comprender. Tengo este TVST en un formulario.

y en el evento OnChecked tengo puesto este código:
Código:

int nRecibo = 0;
double nImporte = 0;

Button1->Enabled = false;
Button2->Enabled = false;
Nodo = Lista->GetFirst();
while (Nodo != NULL)
{
    if (!Lista->HasChildren[Nodo] && (Lista->CheckState[Nodo] == csCheckedNormal || Lista->CheckState[Nodo] == csCheckedPressed))
    {
          nRecibo  = nRecibo + ((PTreeSelRec)Lista->GetNodeData(Node))->Recibos;
          nImporte = nImporte + ((PTreeSelRec)Lista->GetNodeData(Nodo))->Importe;
    }
    Nodo = Lista->GetNext(Nodo);
}

Button1->Enabled = fNueRec->Button1->Tag != 3 ? nRecibo > 0 && nImporte > 0 : nRecibo > 0 && nImporte > 0 && RadioGroup1->ItemIndex >= 0;
Button2->Enabled = Button1->Enabled;
HeaderControl1->Sections->Items[1]->Text = nRecibo > 0 ? (String)FormatFloat("'Recibos: '###,##0", nRecibo) : (String)"";
HeaderControl1->Sections->Items[2]->Text = nImporte > 0 ? (String)FormatFloat("'Importe: '#,###,##0.00 €", nImporte) : (String)"";

Lo que me está ocurriendo es que seleccione el nodo que seleccione el evento se ejecuta tantas veces como nodos tenga el TVST, en este caos hay 37 nodos y pasa 37 veces por el OnChecked. ¿Alguno me puede explicar por qué?

dec 04-08-2022 12:51:04

Hola Ángel,

Puesto que en tu código parece que estás iterando por todos los nodos... ¿estás seguro de que es el evento "OnChecked " el que se ejecuta tantas veces como nodos existentes? ¿No será que lo que se ejecuta 37 veces es el código que tienes dentro del bucle "while"?

En todo caso... salte de tu app... esto es... crea una app nueva, sólo para pruebas, coloca un componente de este tipo con un par de nodos... y haz la misma prueba, usa el mismo evento (pero no el mismo código dentro del evento) a ver qué puedes observar.

escafandra 07-08-2022 14:00:52

No he utilizado ese componente pero se me ocurre que compruebas una cosa. En tu imagen aparece un nodo llamado Seleccionar todos y otro llamado Banco de los que cuelgan el resto.
Si haces check en uno de esos nodos con hijos se activan todos los hijos y eso puede ser la causa de la múltiple generación de eventos OnChecked (esto lo puedes comprobar viendo cuantas repeticiones ocurren checkando un nodo sin hijos). Si es este es el caso, quizás deberías cambiar a un OnClick que sólo se generaría una vez.


Como apunta dec, el bucle se va a repetir tantas veces como nodos tengas, pero eso es justo lo que buscas para recorrerlos todos.





Saludos.

Angel.Matilla 08-08-2022 10:20:08

Gracias por las respuestas.
Cita:

Empezado por dec (Mensaje 547769)
Puesto que en tu código parece que estás iterando por todos los nodos... ¿estás seguro de que es el evento "OnChecked " el que se ejecuta tantas veces como nodos existentes? ¿No será que lo que se ejecuta 37 veces es el código que tienes dentro del bucle "while"?

He probado en otros eventos (OnChange, OnClick...) pero en el único en que se ha ejecutado ese bucle de comprobación es en OnChecked. Y el código que hay dentro del bucle se ejecuta una vez para cada nodo.
Cita:

Empezado por escafandra (Mensaje 547847)
Si haces check en uno de esos nodos con hijos se activan todos los hijos y eso puede ser la causa de la múltiple generación de eventos OnChecked (esto lo puedes comprobar viendo cuantas repeticiones ocurren checkando un nodo sin hijos)

Esa prueba no se me había ocurrido. Lo haré a ver que pasa.

Angel.Matilla 08-08-2022 10:33:30

Cita:

Empezado por escafandra (Mensaje 547847)
Si es este es el caso, quizás deberías cambiar a un OnClick que sólo se generaría una vez.

Para no variar tienes razón. En OnClick funciona perfectamente. Gracias.


La franja horaria es GMT +2. Ahora son las 04:15:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi