Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-08-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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é?
Responder Con Cita
  #2  
Antiguo 04-08-2022
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 07-08-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #4  
Antiguo 08-08-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por las respuestas.
Cita:
Empezado por dec Ver Mensaje
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 Ver Mensaje
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.
Responder Con Cita
  #5  
Antiguo 08-08-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comportamiento extraño PrinterSetupDialog newtron Varios 2 19-11-2021 16:32:43
Un comportamiento extraño. TiammatMX Varios 5 03-09-2013 22:54:07
Extraño comportamiento de ADO r1d2m3 Conexión con bases de datos 3 12-12-2009 19:08:32
Un comportamiento extraño en delphi... uper Varios 1 07-08-2004 00:44:14
Comportamiento extraño de Delphi walrus Varios 3 05-08-2004 10:04:32


La franja horaria es GMT +2. Ahora son las 21:01:05.


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
Copyright 1996-2007 Club Delphi