Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Abrir simultáneamente dos formularios Builder c++ (https://www.clubdelphi.com/foros/showthread.php?t=90854)

fabiodidone 19-09-2016 22:28:54

Abrir simultáneamente dos formularios Builder c++
 
Hola gente. Soy nuevo en el foro y les agradezco por aceptarme. Empiezo con una consulta.

Quiero crear una aplicación que al abrir un formulario (Form1), se abra automáticamente un segundo formulario (Form2), todos dentro del mismo proyecto. He leído que se logra utilizando el evento OnActivate del primer formulario, pero no lo logre. Si bien se abren los dos formularios, el primero queda como congelado y no permite hacerle nada. Como si la propiedad Enable estuviera en False, que no lo esta obviamente. Alguna sugerencia? :confused:

Casimiro Notevi 20-09-2016 00:43:29

¿Y tu código para que lo veamos?

Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

exmachina 20-09-2016 03:29:40

Seguramente estas usando ShowModal() donde deberias usar Show().

ecfisa 20-09-2016 04:18:25

Hola.

Si no interpreté mal lo que te sucede, intentalo de este modo:

Unit1.h:
Código PHP:

...

#define WM_AFTER_SHOW (WM_USER + 300)

class TForm1 : public TForm
{
__published:
  
void __fastcall FormShow(TObject *Sender);

private:
  
void __fastcall WMAfterShow(TMessagemsg);
  
BEGIN_MESSAGE_MAP;
    
MESSAGE_HANDLER(WM_AFTER_SHOWTMessageWMAfterShow);
  
END_MESSAGE_MAP(TForm);

public:
  
__fastcall TForm1(TComponentOwner);
};

... 

Unit1.cpp:
Código PHP:


#include "Unit2.h"
...

void __fastcall TForm1::WMAfterShow(TMessagemsg)
{
  
Form2->Show();
}

void __fastcall TForm1::FormShow(TObject *Sender)
{
  
//...
  //...
  
PostMessage(HandleWM_AFTER_SHOW00);
}

... 

Saludos :)

fabiodidone 20-09-2016 22:02:22

Hola, es verdad. Gracias por recordarmelo.

En Unit1.cpp tengo esto:
Código PHP:

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponentOwner)
        : 
TForm(Owner)
{
}


void __fastcall TForm1::FormActivate(TObject *Sender)
{
Form2->Show();


En Unit2.cpp tengo esto otro:
Código PHP:

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponentOwner)
        : 
TForm(Owner)
{



ecfisa 20-09-2016 22:58:26

Hola.

¿ Y ya probaste la sugerencia que te dí ?, por que a mi me funciona perfectamente...



Saludos :)

fabiodidone 21-09-2016 03:59:52

Cita:

Empezado por ecfisa (Mensaje 508961)
Hola.
¿ Y ya probaste la sugerencia que te dí ?, por que a mi me funciona perfectamente...
Saludos :)

Hola, como estas. Todavía no lo probé, pero seguro que lo voy a hacer, porque te funciono.
Que tendrá mi código que deshabilita el primer formulario?

exmachina 21-09-2016 04:29:21

&ecfisa

Hola. Podrias subir el codigo completo y/o explicar para que sirve lo de WM_AFTER_SHOW. Por cierto, gracias a tu codigo acabo de descubrir lo de BEGIN_MESSAGE_MAP/END_MESSAGE_MAP (¡Algun dia tendre que leer la documentacion...!)

Un saludo


ecfisa 21-09-2016 05:03:32

1 Archivos Adjunto(s)
Hola.

El mensaje personalizado WM_AFTER_SHOW, como su nombre lo sugiere, sirve para ejecutar código después del evento OnShow del form. Encontré un enlace que te podría resultar interesante: Messages and Events of Windows Controls.

También te adjunto el código fuente del ejemplo que solicitas.

Saludos :)

exmachina 21-09-2016 06:53:26

Gracias por la respuesta y tambien por el codigo.

fabiodidone 22-09-2016 16:14:31

Baje el Ejemplo, y trate de correrlo así como esta, pero me tira: Expected a file name. :confused: Alguna idea de que me esta faltando?

ecfisa 22-09-2016 17:35:31

Hola fabiodidone.

Por si hubiera habido algún error de transferencia acabo de descargar, descomprimir y probar el adjunto con éxito.

Por favor mostranos la parte de código donde se produce ese error,usa Breakpoints y Trace Into para localizarlo. También especifica sistema operativo y versión de C++ Builder.

Saludos :)

fabiodidone 28-09-2016 21:06:06

Uso siempre el Builder c++ 6.0. En una computadora el Win XP y en otra el 7. El error que tira es este [Linker Fatal Error] Fatal: Expected a file name: Igual gracias por la ayuda.

ecfisa 29-09-2016 13:08:57

Hola fabiodidone.

El error que mencionas, no tiene que ver con la consulta inicial de este hilo sino con caracteres ilegales en los nombres de carpeta donde reside el proyecto, revisa estos enlaces:Buscando en la web con el error vas a conseguir mas enlaces.

Saludos :)

fabiodidone 29-09-2016 15:56:10

Ok, que raro. Cuando lo descargo a mi computadora le dejo el nombre que pone por defecto (que es Ejemplo) y no lo modifico. Esta tal como lo descargo. Abro el Builder, presiono Run o F9 sin mas. Tendría que ver que pasa con algún otro. Tengo el CodeBlock y puede que alguien tenga el Embarcadero. De todas formas voy a ver los enlaces que dices a ver si me aclara que esta sucediendo que no me funciona.

Abrazo!!!

Snaked 01-10-2016 21:45:29

Prueba a poner Form2->Show(); en el evento OnShow() del Form1 en vez de en onActivate()

la diferencia entre Form2->Show() y Form2->ShowModal() es que el modal, no te deja salir de ese formulario si no es cerrando la ventana (o algo asi) mientras que con el Show() solo, puedes cambiar de un formulario a otro en cualquier momento

un saludo


La franja horaria es GMT +2. Ahora son las 12:57:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi