![]() |
![]() |
![]() |
![]() |
![]() |
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
|
||||
|
||||
Gracias por la sugerencia pero no funciona.
Esto es lo que está pasando y me tiene completamente descolocado: ![]() Como veis las tres primeras veces va tomando los valores correctos: 01/10/2022, Ordinarios, Banco (aunque ponía Desconocida este es el valor correcto). En los tres casos aparece HasChildren como true porque en los tres casos hay un hijo y CheckState como csCheckedNormal por que está seleccionado el nodo completo. Pero en cuanto hace Lista->GetNext(Nodo) para tomar el valor TOMELLOSO, sin que el código haga nada CheckState se pone como csUncheckedNormal y, claro está, no se ejecuta el query. |
#8
|
||||
|
||||
Lo curioso es lo que indicaba en otro mensaje: si dejo desplegado el nodo completo antes de empezar a recorrer el árbol si se ejecuta bien el código y esto todavía me desconcierta más.
|
#9
|
||||
|
||||
Parece que encontré la solución. En lugar de preguntar si el nodo tiene hijos, pregunto cuantos hijos tiene:
Nodo = Lista->GetFirst(); Código:
while (Nodo != NULL) { if (Nodo->ChildCount == 0 && Lista->CheckState[Nodo] > csUncheckedPressed) { [...] } Nodo1 = Lista->GetNext(Nodo1); } |
#10
|
||||
|
||||
![]() ![]() ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
||||
|
||||
Pues no, tampoco funcionó
![]() Es como si el árbol tiene más de tres niveles y no está desplegado, al avanzar a ese cuarto nivel automáticamente se quita la marca de selección, sea la que sea. Seguiré investigando. |
#12
|
||||
|
||||
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#13
|
||||
|
||||
![]() ![]() Cita:
Código:
while (Nodo1 != NULL) { if (Nodo1->ChildCount == 0 && (Lista->CheckState[Nodo1] == csCheckedPressed || Lista->CheckState[Nodo1] == csCheckedNormal)) { etc. |
#14
|
||||
|
||||
¿Por qué no creas un proyecto nuevo, limpio para probar? metes un VST y haces unas pruebas.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#15
|
||||
|
||||
Cita:
![]() |
#16
|
||||
|
||||
Es evidente que algo tengo mal puesto en el proyecto original porque he creado otro sólo con un formulario con el TVST y la BB.DD. y sí funciona correctamente. Tendré que estudiar a fondo que estoy haciendo mal en el original.
|
#17
|
||||
|
||||
¿Has probado a eliminar el componente y a volver a poner otro?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#18
|
||||
|
||||
No, no se me había ocurrido. Estaba tan obsesionado con el código que ni se me pasó por la cabeza. Probaré.
|
#19
|
||||
|
||||
![]() ![]() |
#20
|
||||
|
||||
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 |
![]() |
|
|
![]() |
||||
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 |
![]() |
|