Ver Mensaje Individual
  #7  
Antiguo 29-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
En principio no es buena idea crear todas las ventanas desde el principio de la aplicación, es una sobrecarga innecesaria. Lo óptimo es crear dinámicamente las ventanas que vas abriendo y cuando se cierre, que se libere la memoria. Así aligeramos la carga de la aplicación y además no supone "esperas" cuando se crea una ventana determinada, (no tarda tanto como se suele suponer).

Pasando un poco de ese tema, vamos al grano. No se trata de esa ventana, sino de la filosofía que usas:

Código Delphi [-]
 SplashScreen:=TSplashScreen.Create(application);
  SplashScreen.Show;
  SplashScreen.Hide;
  SplashScreen.Free;
En la primera línea estas diciendo que el objeto "Application" es el encargado de destruir la ventana Splash, sin embargo, en la última línea, te encargas tú de liberarla, por tanto, cuando la aplicación se cierre al completo, irá a destruir un objeto que ya fue liberado con el error que te da.

Hay varias formas para solventar esto, te comento ambas porque te será necesario.

Lo que no me gusta, pero funciona sin problemas:
Código Delphi [-]
 SplashScreen:=TSplashScreen.Create(application);
  SplashScreen.Show;
  SplashScreen.Hide;
  FreeAndNil(SplashScreen);
Aqui decimos que el objeto Application será el encargado de destruir el Splash, pero nosotros (que necesitamos liberarlo antes de que se cierre la aplicación), lo liberamos con FreeAndNil (mira la ayuda). De esta forma, cuando el objeto Application vaya a destruir a Splash, se "da cuenta" de que ya ha sido liberada y no hace nada (no provoca el error de antes).

Lo que si me gusta y uso a menudo (me gusta tener el control de todo ):
Código Delphi [-]
 SplashScreen:=TSplashScreen.Create(nil);
  SplashScreen.Show;
  SplashScreen.Hide;
  FreeAndNil(SplashScreen);

Ahora en la primera línea le decimos a Delphi que nadie (nil) se encargará de destruir la ventana, porque yo mismo me encargo de ello.

Además uso FreeAnNil como respaldo, es decir, si necesito mostrar el splashScreen en un momento dado, puedo preguntar si ha sido creado o no:
Código Delphi [-]
  if not Assigned(SplashScreen) then //  (si no ha sido creada, la creo yo)
    SplashScreen := TSplashScreen.Crete(nil);

  SplashScreen.Show; // por último se muestra

Tendrás que mirar estos detalles, por si liberas alguna forma / informe de quickreports / etc antes que el objeto Application.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita