| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Comodin Cdt

Registrado: 07 Mar 2011Mensajes: 21
|
Publicado: Lun 07 Mar, 2011 4:53 pm Asunto: Este error me supera |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 Mar, 2011 7:47 pm Asunto: |
|
|
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 |
|
 |
Comodin Cdt

Registrado: 07 Mar 2011Mensajes: 21
|
Publicado: Lun 07 Mar, 2011 9:42 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 Mar, 2011 10:06 pm Asunto: |
|
|
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 |
|
 |
Comodin Cdt

Registrado: 07 Mar 2011Mensajes: 21
|
Publicado: Lun 07 Mar, 2011 10:28 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 Mar, 2011 10:42 pm Asunto: |
|
|
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 |
|
 |
Comodin Cdt

Registrado: 07 Mar 2011Mensajes: 21
|
Publicado: Lun 07 Mar, 2011 11:44 pm Asunto: |
|
|
| Entiendo, muchas Gracias por Responder mis dudas |
|
| Volver arriba |
|
 |
|