Buenas llevo una semana intentando dar con un error y no doy...Para la consulta he reducido el codigo lo mas que he podido para hacerlo mas legible, por lo cual la Aplicacion carece totalmente de sentido pero escenifica perfectamente el problema.
He creado una Clase Opciones
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 ....
Clase TForm1: PUBLIC TForm
{
private:
Opciones * TOpciones;
......
}end;
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:: ComboChange(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,OpcFiltros);
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....
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 modifico 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
Opciones = Filtro->LeeOpciones(); //Leeo Opcione modificadas
Si elimino la siguiente linea del mismo procedimiento tambien funciona
GroupBox->Font->Color = clSilver
Alguna ide Gracias