PDA

Ver la Versión Completa : Más sobre las SplashScreen


salvica
30-10-2005, 07:21:46
Hola de nuevo a tod@s

Estoy intentando aplicar lo que explicais por estos foros a una SplashScreen (showthread.php?t=14928&highlight=splash) que me he creado, pero me encuentro con el problema de que si se pulsa sobre ella, actúa como el MainForm y me salta el error de raised exception .. bla, bla, bla ... Cannot focus a disables or invisible window (Form_Main)'

Lo he solucionado poniendo la propiedad "Enabled := false;", pero no se si lo estoy haciendo bien ¿hay alguna otra forma de hacerlo?

Application.Initialize;
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Application.CreateForm(TForm_Main, Form_Main);
Application.CreateForm(TForm_Msg, Form_Msg);
SplashForm.Free;
Application.Run;


Tambien he optado por quitar de ahi la eliminación del Splash y ponerlo en el método Show del Form_Main (para eliminarla cuando se visualice éste)

Application.Initialize;
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Application.CreateForm(TForm_Main, Form_Main);
Application.CreateForm(TForm_Msg, Form_Msg);
Application.Run;


unit frmMain;
interface
uses
{ uses mios que deben ponerse aqui }
frmSplash, { SplashForm }
.....
.....

procedure TForm_Main.Form_OnShow(Sender: TObject);
begin
.....
{ eliminar el SpashScreen }
SplashForm.Hide;
SplashForm.Free;
end;

Saludos
salvica

dec
30-10-2005, 07:30:30
Hola,

No creo que tengas que hacer nada sobre la "Splash Screen" en el formulario principal. De todas formas en tu código se pueden ver cosas "mejorables", a tenor de lo que Zarko Gajic (http://delphi.about.com/) cuenta en su artículo "Creating a Splash Screen in Delphi applications (http://delphi.about.com/od/formsdialogs/a/splashscreen.htm)" (en inglés). Échale un vistazo, a ver si te aclara algunas cosas, creo que merece la pena.

salvica
30-10-2005, 08:19:30
Hola Dec, ante todo gracias por reponder tan rápido

He mirado el enlace que has puesto, y solo diferencio la posición donde se inicializa la aplicación. He cambiado el código a

// Application.Initialize; //-----> posición original
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
Application.Initialize; //-------> Zarko dice que aquí
SplashForm.Update;
Application.CreateForm(TForm_Main, Form_Main);
Application.CreateForm(TForm_Msg, Form_Msg);
Application.CreateForm(TForm_Metars, Form_Metars);
SplashForm.Hide;
SplashForm.Free;
Application.Run;

y ahora visualiza el Splash y cierra la aplicación en cuanto se oculta :confused::confused::confused:

¿Por? (creo que esto lo he visto reflejado en el foro, voy a buscarlo)
Gracias y se siguen admitiendo ayudas
salvica

Pdta.:
Me he colado, :mad::mad::mad: tenía abierto el proceso en segundo plano y se cerraba por eso (es que evito dobles instancias)

Al pulsar sobre el Splash, me vuelve a sacar el mensaje inicial de error de foco, por lo que solo veo la opción de desactivarla

dec
30-10-2005, 08:37:01
Hola,

No sé qué puede ocurrir, pero, si echas un vistazo al adjunto verás que todo va como se espera... vamos, hasta nueva orden por lo menos. ;)

salvica
30-10-2005, 09:23:38
Nos hemos cruzado ;)

Cuando yo he editamo el mensaje anterior y he leido el tuyo, tu estabas editando tu mensaje para cambiar el código del proyecto

Lo dicho, me aparece el error inicial

dec
30-10-2005, 09:43:26
Hola,

Pero tú puedes ver en el ejemplo que adjunté más arriba cómo puedes "tocar", "pulsar" en la "Splash Screen" sin que esto suponga ningún error... Entonces, tal vez el problema no esté en la "Splash Screen", ni en cómo estás mostrándola, sino que puede estar en otro lado. No sé... Supongo que si estás llevando a cabo en la creación del formulario principal (evento "OnCreate"), o cuando lo muestras o en otro lugar, o quizá otros formularios... no digo nada, pero, si algo se me ocurre es que el error no provenga de la "Splash Screen".

Lepe
30-10-2005, 14:44:48
Intuyo que en el SplashForm tienes algun código escrito, porque hacer un clic sobre el SplashForm, no debe hacer nada. Si al hacer un clic intentas cerrarlo o pasar el foco a otra ventana, y ésta no ha sido creada, es lógico que salte una excepción.

No debes hacer referencias a la SplashForm en ninguna otra parte de tu proyecto, solo en la opción de "Acerca de ..." para crearlo de nuevo.

Yo, en principio, siempre he usado:

Application.Initialize;
SplashForm := TSplashForm.Create(nil);
SplashForm.Show;

SplashForm.Update;
Application.CreateForm(TForm_Main, Form_Main);
Application.CreateForm(TForm_Msg, Form_Msg);
Application.CreateForm(TForm_Metars, Form_Metars);
FreeAndNil(SplashForm);
Application.Run;

Como ves hay ciertas diferencias, pero son para controlar posibles errores.


saludos

salvica
30-10-2005, 23:06:54
Hola [b]Dec, perdona pero salí de trabajar y me fui a la cama :p (llevaba 28 horas + una de propina por el cambio de horario)

El splash solo muestra un logotipo y un mensaje de bienvenida, mientras se ejecuta el Form_Main (compueba las tabla de trabajo, limpia registros viejos y subdirectorios de datos, etc) por lo que no lleva ningún código (solo la definición de las etiquetas e iconos) y como el form principal tarda unos 10 segundos en abrirse, no necesito retardarlo

Como decía en la pregunta inicial, si al splash le pongo la propiedad enabled := false; me deja abrir otras aplicaciones (navegador, excel, etc) e incluso pulsar sobre él sin problemas (solo que aparecen las fuentes difuminadas, por la cuestión del enabled, pero esto es solucionable con un poco más de trabajo)

Si le pongo enabled := true;, entonces, simplemente con abrir el navegador, me salta el error de pérdida de foco (o que quiere dar el foco al main, que aún está oculto)

En fin, tendré que rehacer el proyecto y ver en que zona estoy metiendo la pata :D
Saludos y gracias
salvica

Lepe
31-10-2005, 14:11:58
Inequivocamente, las pruebas que has hecho te tienen mareado.

El tema está en que en el evento OnShow, no se puede llamar a Hide. En principio, no para el mismo formulario que se está mostrando, no he probado a esconder otro (como haces tu con el Splash). Dicho sea de paso, no tienes que hacer un .Hide para despues hacer un .Free, puedes llamar directamente a .Free.

Supongo que las tareas de mantenimiento que hablas, las haces en el MainFormCreate, pues en ese evento, puedes poner el FreeAndNil(Splash) como última instrucción y quitarla del dpr.

Insisto: deja Enabled a True desde un principio en diseño, y no lo toques.

Revisa mi codigo, ya que el Splash se crea con el parámetro nil para que nadie lo destruya, y por eso tienes que usar el FreeAndNil (que es más seguro que el .Free).

Es tan lioso, porque puedes hacer lo que quieras en 3 sitios distintos, organizate y despues lo pones en marcha.

Espero que te haya aclarado algo en lugar de liarte más.

saludos