PDA

Ver la Versión Completa : Abrir simultáneamente dos formularios Builder c++


fabiodidone
19-09-2016, 22:28:54
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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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:

...

#define WM_AFTER_SHOW (WM_USER + 300)

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

private:
void __fastcall WMAfterShow(TMessage& msg);
BEGIN_MESSAGE_MAP;
MESSAGE_HANDLER(WM_AFTER_SHOW, TMessage, WMAfterShow);
END_MESSAGE_MAP(TForm);

public:
__fastcall TForm1(TComponent* Owner);
};

...


Unit1.cpp:


#include "Unit2.h"
...

void __fastcall TForm1::WMAfterShow(TMessage& msg)
{
Form2->Show();
}

void __fastcall TForm1::FormShow(TObject *Sender)
{
//...
//...
PostMessage(Handle, WM_AFTER_SHOW, 0, 0);
}

...


Saludos :)

fabiodidone
20-09-2016, 22:02:22
Hola, es verdad. Gracias por recordarmelo.

En Unit1.cpp tengo esto:

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

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}


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

En Unit2.cpp tengo esto otro:

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner)
: 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...

http://s9.postimg.org/srqwtbfnj/fabiodidone.gif

Saludos :)

fabiodidone
21-09-2016, 03:59:52
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
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 (http://www.functionx.com/cppbuilder/Lesson06.htm).

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 (http://docwiki.embarcadero.com/RADStudio/Seattle/en/Overview_of_Debugging) 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:

Expected a file name (http://www.richelbilderbeek.nl/CppLinkErrorExpectedAfileName.htm)
How Can I Solve " [linker fatal error]Fatal:Expected a Filename " in C++Builder6 ? (https://groups.google.com/forum/#!topic/borland.public.cppbuilder.ide/XuvIPXk6pc8)
[Linker Fatal Error] Fatal: Expected a file name: (http://www.delphigroups.info/3/2/224221.html)

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