 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 29 Nov, 2017 6:31 pm Asunto: TListView "desaparece" |
|
|
En un aplicación con BCB 6 estoy teniendo problemas; seguro que es un error de concepto mio pero no soy capaz de verlo.
Tengo un TListView con Checkboxes activado y definido en tiempo de diseño y que relleno por código. Ahí no tengo ningún problema. Una vez que he seleccionado las líneas que me interesan hago una comprobación con este código:
| Código: | lPrueba = false;
nFcargo = 1;
switch (ContarLista(fSelRec->Lista))
{
case 0:
delete fSelRec;
Mensaje(3, "No seleccionó ningún recibo.", "Volver");
Button2Click(NULL);
return;
case 1:
for (nItem = 0; nItem < fSelRec->Lista->Items->Count; nItem ++)
if (fSelRec->Lista->Items->Item[nItem]->Checked && StrToInt(fSelRec->Lista->Items->Item[nItem]->SubItems->Strings[2]) == Month)
{
lPrueba = true;
break;
}
default:
if (!lPrueba)
{
cAux = "¿Desea generar los recibos seleccionados con fecha de cargo " + dFcargo.FormatString("dd/mm/yyyy', '") +
"\nen la fecha propuesta u otra fecha?";
nFcargo = Mensaje(2, cAux, dFcargo.FormatString("dd/mm/yyyy") + "\nFecha propuesta\nOtra fecha");
}
break;
}
fForBln->Barra->MaxValue = fSelRec->Lista->Items->Count; |
Todas las variables (lPrueba, nFcargo, etc.), funciones (Mensaje, etc.) y formularios (fForBln) están perfectamente definidos y funcionan porque se usan en otros puntos de la aplicación sin problema. Pero en este caso una vez que ejecuto ContarLista, al volver me da un error; la función es esta:
| Código: | int ContarLista(TListView *evLista)
{
int nHay = 0;
for (int nValor = 0; nValor < evLista->Items->Count; nValor ++)
if (evLista->Items->Item[nValor]->Checked)
nHay ++;
return nHay;
} |
Como veis es una función muy tonta que lo único que hace es contar las líneas del TListView que están marcadas. Ya sé que es una tontería, pero me ahorro andar poniendo código por todos lados. Sin embargo en este caso, al ejecutar la última línea del código que he puesto al principio (fForBln->Barra->MaxValue...) me da este error:
| Cita: | | Access violation at address 004990E2 in module 'Afiliados.exe'. Read of address 0000022C |
He comprobado con el depurador que el objeto Lista del formulario fSelRec, al salir de ese bucle switch, aparece como NULL. No se me courre que hacer. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 29 Nov, 2017 11:03 pm Asunto: Re: TListView "desaparece" |
|
|
| Angel escribió: |
| Código: |
lPrueba = false;
nFcargo = 1;
switch (ContarLista(fSelRec->Lista))
{
case 0:
delete fSelRec;
Mensaje(3, "No seleccionó ningún recibo.", "Volver");
Button2Click(NULL);
return;
.... |
|
¿No será que entras de nuevo en ese código tras haber destruido fSelRec y sin haberlo vuelto a crear?
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 30 Nov, 2017 10:07 am Asunto: |
|
|
No. Fíjate que tras el delete hay un return y por lo tanto el resto del código no se ejecuta. Y si no entra por el case 0 no se hace el delete. He cambiado un poco la estructura del programa y lo he dejado así:
| Código: | lPrueba = false;
nFcargo = 1;
switch (nListView)
{
case 0:
delete fSelRec;
Mensaje(3, "No seleccionó ningún recibo.", "Volver");
Button2Click(NULL);
return;
case 1:
DecodeDate(dFcargo, Year, Month, Day);
for (nItem = 0; nItem < fSelRec->Lista->Items->Count; nItem ++)
if (fSelRec->Lista->Items->Item[nItem]->Checked && StrToInt(fSelRec->Lista->Items->Item[nItem]->SubItems->Strings[4]) == Month)
{
lPrueba = true;
break;
}
}
fForBln->Show();
fForBln->IniBarra("Preparando recibos");
fForBln->Barra->MaxValue = fSelRec->Lista->Items->Count;
if (!lPrueba)
{
cAux = "¿Desea generar los recibos seleccionados con fecha de cargo " + dFcargo.FormatString("dd/mm/yyyy', '") +
"\nen la fecha propuesta u otra fecha?";
nFcargo = Mensaje(2, cAux, dFcargo.FormatString("dd/mm/yyyy") + "\nFecha propuesta\nOtra fecha");
} |
Con esa estrutura he comprobado que hasta que no pasa por la línea fForBln->IniBarra("Preparando recibos") no hay problema. Ese fForBln es un formulario que tiene un TImage, un TPanel, un TCGauge y un TLabel; lo uso para las típicas pantallas de Espere un momento mientras corre una barra y en esa llamada IniBarra lo que hay es esto:
| Código: | void __fastcall TfForBln::IniBarra(AnsiString cMensaje)
{
Barra->MaxValue = 0;
Barra->MinValue = 0;
Barra->Progress = 0;
LblBar->Caption = cMensaje;
Application->ProcessMessages();
this->Refresh();
} |
No hay absolutamente ninguna referencia a ningún TListView. Estoy bastante desconcertado porque no es el único sitio en hago uso de ese modelo de código. Es más: He hecho otra prueba dejando el código como al principio, cono los dos case y el default y si se ejecuta la línea nFcargo = Mensaje(2,... también se "borra" el contenido del TLIstView; es como si por el simple hecho de llamar a otro formulario se borraran elementos del formulario activo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 30 Nov, 2017 10:35 am Asunto: |
|
|
Aveces errores a distancia se manifiestas en zanas de código que no deberían y eso es porque la ejecusión en windows no es lineal l las fugas de memoria tienen efectos tardíos. Vigila lo que hace tu función Mensaje y eventos que puedan estar saltando y que usen mal algún puntero.
Sobre el fragmento con el delete:
| Código: |
switch (nListView)
{
case 0:
delete fSelRec;
Mensaje(3, "No seleccionó ningún recibo.", "Volver");
Button2Click(NULL);
return;
|
Button2Click(NULL) no sabemos que hace, ni lo que hace Mensaje, ni si tras la destrucción y desde otra zona del código, vuelves a entrar con fSelRec ya destruido...
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Sab 02 Dic, 2017 12:24 pm Asunto: |
|
|
Ya he descubierto donde está el problema. Cuando cierro cualquier formulario, el evento OnClose tengo esto:
| Código: | void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
} |
Evidentemente, al cerrar ese fSelRec y correr este evento deja de existir la información. Una verdadera estupidez por mi parte. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|