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 

Este error me supera

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Este error me supera Responder citando

Hola accedo a este foro con la esperanza de que alguien pueda decirme que error cometo para que la Aplicacion no funcione correctamente, llevo una semana intentando dar con el error y no doy...Para la consulta he reducido el codigo lo mas que he podido para hacerlo mas legible, la Aplicacion carece totalmente de sentido pero escenifica perfectamente el problema.

He creado una Clase Opciones

Código:

class TOpciones
private:
     bool   *OpcActivas;  //Vector Booleano       
public :
 
     TOpciones();  /Constructor
     TOpciones(const TOpciones &f);   //Constructor Copia
     TOpciones&operator=(const TOpciones&f);  //Sobrecarga operador Asignacion
    //Procedimientos
     void ActivarOpcion(char NOpc);
     bool LeerOpcion(char NOpc);
};end
 
//---------------------------------------------------------------------------
TOpciones::TOpciones
{
  //Inicializo Vector
 OpcActivas = new bool [10];
 for(int a=0;a<10;a++){OpcActivas[a] = false;}
}
 
//---------------------------------------------------------------------------
TOpciones::TOpciones(const TOpcionesc &f)
{
  *this = f;
}
 
//---------------------------------------------------------------------------
//COPIA
TOpciones & TOpciones::operator=(const TOpciones &f)
{
  if(OpcActivas){delete[]OpcActivas;}
  FiltrosAct = new bool [10];
  memcpy(OpcActivas,f.OpcActivas,10 *sizeof(bool));
  //Copio Vector
  return *this;
}
 
//---------------------------------------------------------------------------
void TFiltrOpc::ActivarOpcion(char NOpc)
{
  OpcActivas[NOpc] = true;
}
 
//---------------------------------------------------------------------------
bool TFiltrOpc::LeerOpcion(char NOpc)
{
  return OpcActivas[NOpc];
}

Tengo tengo un Form1 que contiene un TCOMBOBOX (0,1) , un TBOTON (BotGenerar) un TGROUPBOX (vacio) ademas posee una Variable Objeto TOpciones ....

Código:

Clase TForm1: PUBLIC TForm
{
private:
     Opciones  * TOpciones;
   ......
}

 void __fastcall TForm1::FormShow(TObject *Sender)
{
   //inicializo
   Combo->Clear();
   Combo->Items->Add(0);Combo->Items->Add(1);
   Combo->ItemIndex  = 0;

   Opciones = new TOpciones;


//---------------------------------------------------------------------------
void __fastcall  TForm1:: ValorChange(TObject *Sender)
{
  GroupBox->Font->Color   = clNavy;
 if(OpcFiltros->LeerOpcion(1))
    {
         BotGenerar->Visible = false;  ///AQUI SE PRODUCE EL ERRORRR
         for(int a=1;a<1000000000;a++){int o=o+1;} //Bucle espera
     }
 
  BotGenerar->Visible = true;
}
 
//---------------------------------------------------------------------------
void __fastcall  TForm1::BotGenerarClick(TObject *Sender)
{
 
  TForm2  *Form2 = new TForm2(this,Opciones);
  switch (Form2->ShowModal())
     {
         case mrOk:
             {
               Opciones = Filtro->LeeOpcionesModifIcadas();  //Leeo Opcione modificadas
               break;
             }
     }
 delete TForm2;
Combo->ItemIndex          = 0;
GroupBox->Font->Color   = clSilver ;

}


Por ultimo tengo un Form2 (al que accedo desde Form1) donde le paso como parametro el puntero TOpciones del que hago una copia la cual modifico, y salgo al Pulsar un Boton Salir que posee....

Código:
class TForm2 : public TForm
{
 __published:          TButton *BSalir;
  void __fastcall BSalirClick(TObject *Sender);
 
public:     // User declarations
 
  __fastcall TFFiltros(TComponent* Owner,TOpciones *Op);
 
     TOpciones   *LeeOpcionesModifIcadas();
 
private:    // User declarations
 
   TOpciones  *Opciones2;    //Objeto Opciones cOPIA
};end
 
 
__fastcall TForm2::TForm2(TComponent* Owner,TOpciones *OP)
        : TForm(Owner)
{
  //Asigno Opciones en Filtros
  Opciones2  = new TOpciones(*OP);  //COPIO
  Opciones2->ActivarOpcion(1);        //Modifico Opcion
}
 
//----------------------------------;-----------------------------------------
TFiltrOpc *TFFiltros::LeeOpcionesModifIcadas()
{
  return Opciones2;
}
 
//---------------------------------------------------------------------------
void __fastcall TFFiltros::BSalirClick(TObject *Sender)
{
 ModalResult= mrOk;
}



Ejecuto la aplicacion...En Form1 Selecciono en el ComboBox el valor uno, se muestra en pantalla el boton Generar y lo "acciono" Se habre el Form2 al que se le pasa el parametro puntero Opciones, al cual le hago una copia que se modifica automativamente.Pulso el boton salir..Salgo del Form2 Se muestra el Form1 que Lee el Objeto Opciones modificado.

El Problema Surge hora... vuelvo a seleccionar el valor 1 del ComboBox y !!DESAPARECE DE LA PANTALLA EL TGROUPBOX !!!

Creo que el problema tiene que ver con el puntero OPciones ya que si elimino la siguiente linea del procedimiento BotGenrear de la classe Form1 funciona (no desaparece)

Código:
Opciones = Filtro->LeeOpciones();  //Leeo Opcione modificadas


Si elimino la siguiente linea del mismo procedimiento tambien funciona

[code=cpp]GroupBox->Font->Color = clSilver [/code]

Que Error Cometo Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Comodin:

Mi consejo es que usas la opción de copiar y pegar directamente desde el código compilable, ya que es un trabajillo corregir los errores solo para hacer una prueba. O mejor aún, que subas a algún sitio un pequeño proyecto donde reproduzcas el problema y pongas aquí el enlace, para que así el que te responda pueda probarlo más cómodamente... seguramente tendrías muchas más probabilidades de recibir respuesta..

Y otro consejillo es que titules los hilos con algo más descriptivo, esto es útil para cuando alguien en el futuro haga búsquedas en el foro de con los mensajes más fácilmente..

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por contestar, he tomado nota de tu consejo y ha subido la "Aplicacion" que da error en la siguiente direccion

[url] http://www.megaupload.com/?d=ONBEHJX4[/url]

Incluye un archivo de Texto "LeemError.txt" donde indico los pasos para que se de el error
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Veo que el GroupBox desaparece, pero si esperamos está haciendo la operación y vuelve a aparecer cuando acaba. El problema que ocurre es que al estar dentro de un bucle muy largo no se procesa la cola de mensajes y no puede atender a los eventos WM_PAINT..

Prueba añadiendo lo siguiente dentro del bucle que tienes en el evento OnChange del Combo:

if (!(a % 100000)) Application->ProcessMessages();

Con esto hacemos que se procese la cola de mensajes cada x iteraciones, he puesto un numero alto para que no se ralentice mucho el bucle.

Cuando tu programa va a permanecer bloqueado dentro de un bucle largo añade ..ProcessMessages, o bien diseña tu programa de otra manera ejecutando esas tareas en otro hilo..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por contestar....

Entiendo lo que dices pero no comprendo por que al borrar la linea


Código:
  GCantidad->Font->Color   = clSilver



del procedimiento BotGenerarClick del F1 si "funciona" y en teoria el bucle es posterior
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Quizás al cambiar la propiedad de color del GroupBox esto provoca que más tarde envíe más mensajes a la cola, y al bloquear esta pues no se procesan.

Vamos que no creo que valga la pena analizar si envía más o menos mensajes a la cola cuando la estamos bloqueando por mucho tiempo..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Entiendo, muchas Gracias por Responder mis dudas
Volver arriba
Ver perfil de usuario Enviar mensaje privado
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.