![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Comportamiento extraño de TVirtualStringTree (2)
Buenos días a todos. A ver si alguien es capaz de explicarme por qué me está pasando esto.
Tengo este TVirtualStringTree: ![]() Como veis tiene seleccionados tres nodos. Recorro el árbol para borrar los registros seleccionados con este bucle: Código:
fMenu->Query->Close();
fMenu->Query->SQL->Text = "DELETE FROM Recibos WHERE CodPrv = :PrvIns AND RefInt = :RefInt AND ForPago = :Forma AND Junta = :Junta";
Nodo = Lista->GetFirst();
while (Nodo != NULL)
{
if (!Lista->HasChildren[Nodo] && Lista->CheckState[Nodo] > csUncheckedPressed)
{
try
{
fMenu->Query->Close();
fMenu->Query->ParamByName("PrvIns")->AsString = PrvIns;
fMenu->Query->ParamByName("RefInt")->AsString = ((PTreeSelRec)Lista->GetNodeData(Nodo))->RefInt;
fMenu->Query->ParamByName("Forma")->AsInteger = ((PTreeSelRec)Lista->GetNodeData(Nodo))->ForPago;
fMenu->Query->ParamByName("Junta")->AsInteger = StrToInt(((PTreeSelRec)Lista->GetNodeData(Nodo))->Concepto);
fMenu->Query->ExecSQL();
nRecibos += fMenu->Query->RowsAffected;
fMenu->Query->Transaction->Commit();
}
catch(...)
{
fForBln->Hide();
Screen->Cursor = crArrow;
fMenu->Query->Transaction->Rollback();
Mensaje(1, "Ha tenido lugar un error en el borrado de recibos.", "Volver");
Application->ProcessMessages();
return;
}
}
Nodo = Lista->GetNext(Nodo);
}
|
|
#2
|
||||
|
||||
|
¿No deberías borrar de dentro hacia fuera?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
||||
|
||||
|
Claro, por eso voy avanzando por el árbol. Al llegar a un nodo que no tiene hijos y está seleccionado es cuando ejecuto el query, pero es que cuando llega a ese nodo sin hijos no sé por qué quita la marca de selección sin que yo se lo indique. Es lo que no entiendo.
|
|
#4
|
||||
|
||||
|
Creo que estás diciendo que borras primero "Ordinario", luego "Desconocida" y finalmente "Tomelloso", que no puedes borrarlo.
Y lo que comento es que deberías, creo, borrar en orden inverso, primero "Tomelloso", luego "Desconocida" y finalmente "Ordinario". Si es que he entendido bien.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#5
|
||||
|
||||
|
No. Siento haberme explicado mal. En cada nodo final (Tomelloso en este caso) están todos los valores: fecha, tipo de emisión (Ordinario), forma de pago (Desconocida) y código de la población (Junta). Por eso voy buscando los nodos que no tiene hijos porque sé que en ellos están todos los valores que busco; fíjate en la condición que hay dentro del bucle:
Código:
if (!Lista->HasChildren[Nodo] && Lista->CheckState[Nodo] > csUncheckedPressed) Cita:
|
|
#6
|
||||
|
||||
|
Prueba a ver:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#7
|
||||
|
||||
¡Me rindo! Llevo una semana pegándome de tortas con este problema y no le encuentro solución, así que de momento lo dejo aparcado y tomaré por otra vía. |
|
#8
|
||||
|
||||
|
Pero si en un proyecto nuevo funciona bien, dijiste.
Quita el componente, pon otro nuevo. Mira si tienes algún evento que cambie el estado de ese nodo cuando estás borrando el otro nodo.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#9
|
||||
|
||||
|
Cita:
![]() |
|
#10
|
||||
|
||||
|
Después de darle muchas vueltas y hacer un montón de pruebas, esta mañana me ha venido una idea a la cabeza: dado que el VST tiene activadas las casillas de selección, daba la impresión que al empezar a recorrer el árbol se inicializan los nodos. He hecho varias pruebas con el código así:
Código:
Lista->OnInitNode = NULL; // Añadida para que no inicialice los nodos
Nodo = Lista->GetFirst();
while (Nodo != NULL)
{
if (!Lista->HasChildren[Nodo] && Lista->CheckState[Nodo] > csUncheckedPressed)
{
try
{
fMenu->Query->Close();
fMenu->Query->ParamByName("PrvIns")->AsString = PrvIns;
fMenu->Query->ParamByName("RefInt")->AsString = ((PTreeSelRec)Lista->GetNodeData(Nodo))->RefInt;
fMenu->Query->ParamByName("Forma")->AsInteger = ((PTreeSelRec)Lista->GetNodeData(Nodo))->ForPago;
fMenu->Query->ParamByName("Junta")->AsInteger = StrToInt(((PTreeSelRec)Lista->GetNodeData(Nodo))->Concepto);
fMenu->Query->ExecSQL();
nRecibos += fMenu->Query->RowsAffected;
fMenu->Query->Transaction->Commit();
}
catch(...)
{
Screen->Cursor = crArrow;
fMenu->Query->Transaction->Rollback();
Application->ProcessMessages();
return;
}
}
Nodo = Lista->GetNext(Nodo);
}
Lista->OnInitNode = ListaInitNode; // Añadida para restaurar la acción al volver a cargar
|
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Comportamiento extraño de TVirtualStringTree | Angel.Matilla | C++ Builder | 4 | 08-08-2022 10:33:30 |
| 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 |
| Comportamiento extraño del TPageControl | Chris | OOP | 4 | 02-04-2009 21:16:09 |
| Extraño comportamiento de Firebird 2.0 | TrUnkS | Firebird e Interbase | 4 | 06-01-2007 23:05:57 |
|