FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
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?
|
#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. |
#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:
|
#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. |
#9
|
||||
|
||||
No hay ningún evento ni otra parte del código que modifique el estado del nodo. Lo que ya me tiene completamente perplejo es que si selecciono ese primer nodo que ponía en la imagen del principio y pulso el botón, quita el estado y no hace nada; sin salir del formulario vuelvo a seleccionar el mismo nodo u otro distinto y pulso el botón y esta vez si ejecuta el código asociado. Cada vez lo entiendo menos.
|
#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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|