• Viernes 29 de Marzo de 2024, 13:42

Autor Tema:  ventana llama a otra ventana  (Leído 7564 veces)

picyo

  • Visitante
ventana llama a otra ventana
« en: Lunes 28 de Junio de 2010, 18:28 »
0
Hola, me gustaría saber como puedo hacer una cosa que en principio deberia ser bastante facil, pero no doy una. He creado desde visual C++ una ventana. A esa ventana le añado un botón. Al margen, en el directorio de encabezados, creo un archivo que es Form2.h ( el primero es Form1.h). Ahora con el boton de la ventana 1 ( Form1) quiero que al pulsar vaya a la ventana 2, sin nada mas que eso.

Desde Form1 trato de averiguar como generar el evento de pulsar boton ( en Form1), y estoy mirando en propiedades para el boton y no encuentro nada que diga " al apretar este boton"... que he de hacer ?

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: ventana llama a otra ventana
« Respuesta #1 en: Jueves 1 de Julio de 2010, 10:30 »
0
Primero, eso no es C++, es C++/CLI y es otro lenguaje diferente.

Segundo, el evento se llama Click, y en los botones, haciendo doble clic sobre el botón en tiempo de diseño, te lo crea automáticamente.

Luego, en el evento, tienes que crear el nuevo form y mostarlos:

Form2 ^f=gcnew Form2(this);
f->ShowModal();   //Creo que se llama así, no me acuerdo bien
delefe f;

Y no te olvides de incluir el fichero cabecera del form 2 en el form 1.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

picyo

  • Visitante
Re: ventana llama a otra ventana
« Respuesta #2 en: Jueves 1 de Julio de 2010, 14:19 »
0
pues lo que me has dichio lo he puesto aqui:

form1.h
Código: C++
  1. #pragma endregion
  2.     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
  3.                  //// crear en evento del boton 1 la ventana de Form2
  4.                  Form2 ^f=gcnew Form2(this);
  5.                  f->ShowModal(); //Creo que se llama así, no me acuerdo bien
  6.                  delete f; 
  7.  

me ha dado errores, como :
Código: C++
  1. Error   1   error C3673: 'ventana::Form2' : class does not have a copy-constructor  c:visual studioejerciciosbegining visual c++ 2008examplesventanaventanaventanaForm1.h   88  ventana
  2. Error   2   error C2039: 'ShowModal' : is not a member of 'ventana::Form2'  c:visual studioejerciciosbegining visual c++ 2008examplesventanaventanaventanaForm1.h   89  ventana
  3.  

El constructor de la Form2 es del mismo modo que el de Form1, no he sabido interpretar ese error ( no le gusta lo de gcnew...), asi que digo..vamos a ver..si se ha creado Form1, que impide que lo cree del mismo modo ? y eso he hecho, substituyendo lo que me has dicho ( que realmente no quiero substituirlo) por esto ottro:
Código: C++
  1. #pragma endregion
  2.     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
  3.                  //// crear en evento del boton 1 la ventana de Form2                
  4.                 Application::Run(gcnew Form2());     }
  5.  

Bien no me da errores ni warning, pero al compilarlo y ejecutarse la ventana ( Form1) bien...clico el botón y ... zas! Mensaje de error con tipica opcion de cnacel abort...
Que significaban pues los errores del principio ? Y ya puestos... que impide la ejecución de esta segunda alternativa??

picyo

  • Visitante
Re: ventana llama a otra ventana
« Respuesta #3 en: Jueves 1 de Julio de 2010, 14:48 »
0
bueno lo he solucionado, es bastante próximo a lo que me decías, solo que asi :

Código: C++
  1. Form2 ^f=gcnew Form2();// entre parentesis no hay que poner void
  2.  f->ShowDialog();            // es showdialog
  3. delete f;
  4.  

necesitaba ya hacer una "tonteria" de estas, porque estoy aprendiendo C++ desde la base, lo que es CLR programas de Consola, e intento aplicar lo mínimo de Microsoft ( para proyectos Visual como este no claro) y en el curso que sigo solo hago que implementar arrays punteros ( que se como van pero mi lógica no creo que entienda nunca el verdaddero significado "ahoorativo de memoria" de un puntero..). Merci ! ;)

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: ventana llama a otra ventana
« Respuesta #4 en: Jueves 1 de Julio de 2010, 15:09 »
0
Lo que estás haciendo no es precisamente alejarte del C++/CLI, pero bueno.

Los punteros son lo que son, y te puedo asegurar que sin el concepto de puntero la informática no existiría como tal.

Que no te gusten o no los entiendas es habitual en principiantes, pero que debes aprenderlos es obligatorio.

Respecto a mi error, hace ya un par de años que no uso C++/CLI, y la verdad es que la memoria juega malas pasadas.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

picyo

  • Visitante
Re: ventana llama a otra ventana
« Respuesta #5 en: Jueves 1 de Julio de 2010, 16:29 »
0
NO no, no qiero alejarme de eso, todo lo contrario. Mi pretensión era ( y es) aprender Visual Studio ( primero con C++), pero partiendo desde C++ puro y duro. Para mi lo ideal sería, por ejemplo, no solo hacer sinó entender como construir una ventana (frame) del modo facil al modo mas complicado, haciendote tu tu propoa clase ventana. y si, hay un monton de codigos acerca de eso, pero por eso he remarcado una cosa es hacer y otra entender.
Bueno iniciado no puedo decir que sea, he hecho cosas con C, e incluso proyectos de domótica en PIC ( de ahí mi nik), aunque ahora me estoy dando cuenta de cuantísimo me queda por saber.
Respecto lo de tu equivocación... leñe no ha sido asi, si no hubieses escrito aquello no sabría ni como manejarlo :)

Lo de los punteros... al ver la respuesta a " ¿ Por que un puntero? Veo siempre la de optimización de la memória. A veces da la sensación que todas preguntas y respuestas son un copy paste de todos los sitios. Para mi optimización significa el "gastar" menos memoria, o liberarla lo antes posible. Eso lo entiendo con variables locales; una vez no se necesita o se sale de la funcion, ya " no está". Así pues, un puntero dirije a una zona de memoria donde apunta a una variable. Es decir, dicha variable ha de existir, donde está ese "ahorro"? Solo lo entiendo para la asignación "indirecta" para otros menesteres, pero no por el ahorro...eso no lo veo...

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: ventana llama a otra ventana
« Respuesta #6 en: Jueves 1 de Julio de 2010, 17:22 »
0
Lee esto en cuanto a C++ y C++/CLI (por lo menos la primera parte): http://geeks.ms/blogs/rfog/archive/2009 ... c-cli.aspx

C++/CLI se ha quedado para vestir santos. Es decir, todo lo que aprendas de C++/CLI no te va a servir de mucho, ya que en cualquier momento Microsoft abandona el soporte de Windows Forms y el lenguaje se quedará como herramienta de interoperabilidad entre código nativo y manejado.

Respecto a los punteros... si has leído eso...  :wacko: , quienes lo hayan escrito/copiado no tienen ni p*ta idea de C++.

Los punteros tienen muchos usos, el más utilizado es controlar el tiempo de vida de un objeto. Es decir, creas el objeto cuando tu queras y lo liberas también cuando tu quieras. Un puntero gasta algo más de memoria que una variable normal, porque está el uso del puntero en la pila y el de la variable en el montículo.

El truco está en que con un puntero puedes llamar "hacia atrás" en la pila de llamadas sin que el objeto desaparezca de ámbito, etc.

Otras veces es una optimización de memoria: la pila tiene un tamaño limitado, y usarla para asignar un objeto grande es contraproducente, así como pasar un objeto por valor suele ser una barbaridad (aunque estén las referencias a veces estas no se pueden usar, sobre todo cuando no sabes qué vas a recibir en tiempo de compilación)...

Y hay más usos (y abusos).
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog