• Viernes 8 de Noviembre de 2024, 20:55

Autor Tema:  ¿donde está el error?  (Leído 1382 veces)

cocacolo

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
¿donde está el error?
« en: Sábado 3 de Octubre de 2009, 12:51 »
0
hola tengo 3 formularios, el Form1 no tiene parte visible, es un DataModule1, y tiene como unico código:

void __fastcall TDataModule1::DataModuleCreate(TObject *Sender)
{
   TForm2 * Form2;
   Form2 = new TForm2 (this);
   Form2->ShowModal();
   delete Form2;

   TForm3 * Form3;
   Form3 = new TForm3 (this);
   Form3->ShowModal();
   delete Form3;
}

Con esto creamos el form2, lo mostramos, y los destruimos, y luego lo mismo con el 3, para que esto funcione los formularios 2 y 3 no son creados automáticamente, sino que los creo yo en la función anterior.

Hasta aquí todo va bien, sin embardo si en el form2 añado un botón con el siguiente código:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
        Form3->Label1->Caption = "hola";
}


Da error... con esto pretendo cambiar el Caption de una etiqueta que tiene form3, pero da el error "Access violation at address 004023ac in module 'proyect1.exe'. Read of address 000002f0"
al cerrar la ventana de error y el form2, se habre form3 pero sin ninguna modificación en su label1. Por supuesto form2 contiene la linea #include "Unit3.h" para pode acceder a Form3.

Entonces, ¿qué estoy haciendo mal?

Ya he pensado que el problema podria ser que estamos accediendo a Fom3 cuando aún no ha sido creado y he mofidicado  el código de Form1 para que quede así:

void __fastcall TDataModule1::DataModuleCreate(TObject *Sender)
{
   TForm3 * Form3;
   Form3 = new TForm3 (this);

   TForm2 * Form2;
   Form2 = new TForm2 (this);
   Form2->ShowModal();
   delete Form2;

   Form3->ShowModal();
   delete Form3;
}

pero nada, sigue igual.

hvassago

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: ¿donde está el error?
« Respuesta #1 en: Martes 20 de Octubre de 2009, 19:27 »
0
El problema esta en que la variable Form3 la estas creando dentro del procedimiento void __fastcall TDataModule1::DataModuleCreate(TObject *Sender), por lo tanto es una variable local, asi cuando te refieres a Form3 en en evento
void __fastcall TForm2::Button1Click(TObject *Sender)
{
   Form3->Label1->Caption = "hola"; //Este es un form global
}
Te estas refiriendo a otro form, no es el mismo form.
La opcion mas rapida es que hagas la variable global dentro del form2.