[Delphi] Splash form su ogni modulo dell’applicazione
Lo splash screen può essere utilizzato in più form della nostra applicazione. Infatti si può utilizzare tale modulo per inizializzare l’applicazione, quindi far visualizzare il copyright ed altre informazioni, oppure si può utilizzare tale form per visualizzare delle stringhe di testo come: “Attendere…”, “Ancora qualche secondo”, ecc. Tali messaggi possono essere utili nel caso in cui l’applicazione sta effettuando un operazione che impiega molto tempo.
Quindi per creare dinamicamente un semplice splash screen avvio Delphi, creo una nuova applicazione, inserisco le form che mi servono nella mia applicazione; dopo di che creo un form che mi funge da splash screen, su tale form definisco due variabili:
var:
FormAttesa := TForm;
EtichettaAttesa := TLabel;
Successivamente vado a definire la funzione che avvia lo splash screen:
function AvvioAttesa(Secondaria: TComponent; sMsg: string): boolean;
begin
Result:= False;
// crea il nostro messaggio solo se non è stato creato precedentemente
if (Nil= FormAttesa) then
begin
FormAttesa:= TForm.Create(Secondaria);
with FormAttesa do
begin
//Indico la posizione della form
Position:= poScreenCenter;
Width:= 500;
Height:= 25;
// creo l’etichetta del messaggio
EtichettaAttesa:= TLabel.Create(FormAttesa);
with EtichettaAttesa do
begin
//indico la posizione dell’etichetta
Align:= alClient;
Alignment:= taCenter;
Font.Height:= -20;
ParentFont:= False;
Caption:= sMsg;
Parent:= FormAttesa;
end;
// nascondo la barra del titolo
SetWindowLong(Handle,
GWL_STYLE,
GetWindowLong(
Handle, GWL_STYLE)
and not WS_CAPTION);
ClientHeight:= Height;
Show;
Update;
end;
Result:= True;
end;
end;
Poi passo a definire la procedura relativa ai messaggi di attesa:
procedure AttesaSetMsg(sMsg: string);
begin
EtichettaAttesa.Caption:= sMsg;
FormAttesa.Refresh;
end;
ed implemento la funzione relativa alla fine dell’attesa:
function FineAttesa: boolean;
begin
Result:= False;
if (Nil FormAttesa) then
begin
FormAttesa.Hide;
FormAttesa.Free;
FormAttesa:= Nil;
Result:= True;
end;
end;
A questo punto non mi resta che richiamare quanto su implementato e per fare ciò definisco una procedura MakeSplash:
Infine, considerando di aver salvato il form con il nome Form1, vado ad implementare una procedura che richiama lo splash screen utilizzando semplici stringhe di testo:
procedure TForm1.MakeSplash;
begin
Application.ProcessMessages;
// avvia lo splash screen
AvvioAttesa( Self, ‘Attendere…’);
// avvia lunghe operazioni
AttesaSetMsg( ‘Attendere ancora…’ );
// continua l’operazione
AttesaSetMsg(’Ancora qualche istante…’ );
// completa l’operazione
AttesaSetMsg( ‘Fatto…’ );
// chiude lo splash screen
FineAttesa;
end;
Infine importo lo splash form in tutte le form che desidero che appaia nell’attesa che venga avviata la form ed all’avvio di ognuna di questi moduli, richiamo la procedura makesplash:
TForm1.MakeSplash();
Per concludere apro il file principale del progetto e definisco la variabile:
var
splash:TForm1;
dopo di che implemento quanto segue:
begin
splash:=TForm1.Create(Application);
try
splash.MakeSplash;
Application.Initialize;
Application.Title := ‘Titolo dell’applicazione’;
Application.CreateForm(TForm2, Form2);
splash.Close;
finally
Form1.Free;
end;
Application.Run;
end.
Compilo l’applicazione e la provo, se non ho commesso errori, dovrei visualizzare i primi risultati già all’avvio dell’applicazione.