[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.

Lascia una Risposta

Devi aver fatto il login per inviare un commento