Newsgroup: it.comp.lang.delphi
Titolo: Splash Screen

Buongiorno a tutti!
Per ottenere uno SplashScreen all'avvio del programma ho fatto in
questo modo:
Nell' OnCreate della main Form vado a crearmi la finestra di
SplashScreen su cui ho inserito un oggetto TTime che allo scadere del
tempo stabilito mi chiude e distrugge la finestra stessa mediante il
comando Release.
In questo modo però le finestre si aprono insieme, quindi vedo la
SplashScreen e sotto di essa la Main Form.
Come faccio a Visualizzare solo la finestra di SplashScreen e una volta
chiusa questa ad aprire la Main Form?
Ciao
Stefano M.

Vai sul file principale del progetto, crea la finestra di splash prima 
della chiamata Application.CreateForm, sulla finestra principale, alla 
fine delle procedure chiamate nell'OnCreate distruggi la form di splash 
scree. Se poi le tue inizializzazioni sono lunghe, sempre alla fine 
dell'evento oncreate della form principale attiva un timer che 
distruggerà la form di splash.
Riepilogando....
Nel file di progetto (.dpr)
Begin
   FSplash := TFSplash.Create(Application);
   FSplash.Show;
   Application.Initialize;
   Application.CreateForm(TBtTarga, BtTarga);
   Application.Run;
End
Nell'oncreate (1° caso)
Procedure Fmain.OnCreate(Sender:TObject);
Begin
   ... inizializzazioni varie ...
   FSplash.free;
End;
Nell'oncreate (2° caso)
Procedure Fmain.OnCreate(Sender:TObject);
Begin
   ... inizializzazioni varie ...
   TimerDistruggi.Enabled := True;
End;
e, ovviamente:
Procedure FMain.TimerDistruggiTimer(Sender : TObject);
Begin
   FSplash.free;
End;
Ciao,
David

Riferendomi al primo caso:
1.Quando lancio il programma mi vengono aperte sempre entrambe le
finestre.
2.Se il comando FSplash.free viene inserito nell'OnCreate della Main la
finestra non viene chiusa, non andrebbe inserito nell'OnTimer dell
TTimer?

Ora ho capito. Non ti riferisci ad uno splash screen standard.
Allora...
La Form pricipale dovrebbe essere il tuo splash screen
Al suo interno dovrebbe avere un timer che allo scadere lancierà la Form 
(quella che è ora la tua form principale) è si renderà "invisibile" 
(occhio che se la rendi veramente invisibile anche la finestra chiamata 
lo sarà - ti basterà posizionarla fuori dello schermo, per esempio con 
top = 5000)
Quindi nel timer della finestra di splash dovrebbe esserci:
Procedure FSplash.Timer1Timer(Sender : TObject);
Begin
   FMain := TFMain.create(application);
   Fmain.show
   top := 5000;
End;
Ora però devi ricordarti di chiudere il tuo applicativo eliminando la 
finestra di splash altrimenti non ti si chiuderà mai
Volendo puoi anche fare cosi' (non testata)
Procedure FSplash.Timer1Timer(Sender : TObject);
Begin
   Top := 5000;
   FMain := TFMain.Create(Application);
   FMain.ShowModal;
   FMain.Free;
   Close;
End;
Tornando un attimo a quanto hai detto le finestre appaiono insieme in 
quanto il caricamento del tuo programma è molto veloce

Ho fatto in questo modo:
Ho impostato la finestra principale come Main del Progetto.
Nell'evento OnCreate della stessa gli ho dato il seguente codice:
  top := 5000;
  FSplash := TFSplash.Create(Application);
  FSplash.Show;
Così essa scompare e viene fuori la finestra di SplashScreen sulla
quale ho inserito un TTime.
Nel OnTime del componente ho scirtto:
  FMain.Top := 150;
  FMain.Visible := true;
  Release;
Così la SplashScreen la distruggo e la Main Form torna ad essere
visibile.
Anche se non mi pice molto l'idea di spostare la Fomr, il tutto
Funziona!
Ciao
Stefano M.

Correzione.....Nell' OnTime il comando "FMain.Visible := true" non
c'entra niente...
L'ho inserito x sbaglio!
:-)
Bye

Se ti da noia l'idea di spostare fuori dallo schermo
la Main Form prova a fare cosi':
Nel file di progetto (.dpr)
begin
   fSplash := TfSplash.Create(Application);
   fSplash.Show;
   Application.Initialize;
   Application.CreateForm(TfMainForm, fMainForm);
   fSplash.Free
   Application.Run;
end;
Fino all'istruzione *Application.Run* la tua fMainForm non e' visibile
comunque.
Andre

In quel caso però la FSplash esiste e si vede solo mentre avviene
l'inizializzazione della main form e fino alla sua creazione vero?

Si, non avevo capito bene il tuo scopo, nel mio esempio
precedente la fSplash rimane solo per il tempo di creazione
di fMainForm.
eccone un altro allora:
begin
   Application.Initialize;
   fSplash := TfSplash.Create(Application);
   fSplash.ShowModal;
   Application.CreateForm(TfMainForm, fMainForm);
   Application.Run;
end;
metti poi un TTimer nella fSplash e all'evento OnTimer
begin
  Timer1.Enabled := False;
  Close;
end;
cosi' viene chiusa fSplash e l'applicazione prosegue poi con
  .....
  Application.CreateForm(TfMainForm, fMainForm);
  Application.Run;
end;
Questa volta spero di aver capito :-)
Andre

Praticamente è il punto da cui siamo partiti !!! :-)
E il problema è sempre quello, le form si aprono insieme e quindi si
vedono entrambe anche se dopo un tot di tempo la SplashScreen scompare.
Comunque è funzionante l'idea di spostare la Main Form fuori dallo
schermo.
Quindi come al solito vengono create insieme però si vede solo la
SplashScreen, poi quando questa viene chiusa restituisco la posizione
alla Main Form.
Stefano

Puoi provare anche cosi':
program Project1;
uses Forms, Unit1 in 'UNIT1.PAS' {Form1}, Splash;
{$R *.RES}
var
  SplashScreen : TSplashScreen;
begin
  Application.CreateForm(TForm1, Form1);
  SplashScreen := TSplashScreen.Create(Application);
  try
    SplashScreen.Show;
    SplashScreen.Update;
 {permette che ogni "CreateForm" o qualsiasi altro messaggio venga 
attuato prima che sia avviata l'applicazione. Se le procedure di  avvio 
risultassero troppo lente, il metodo "Application.ProcessMessages" 
permette a Windows di rispondere periodicamente ai messaggi}
  finally
    SplashScreen.Free;
  end;
  Application.Run;
end.
tip trovato su: 
http://www.mclink.it/mclink/delphi/faq/dtr-faq.htm
In questo modo non e' necessario creare lo splash nell'evento OnCreate 
della form principale.
---
Ryo GQI