Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

TListView "desaparece"

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TListView "desaparece" Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: TListView "desaparece" Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.