[29-11-05]
test
test
Delphipedia - Delphipedia - Een beter SplashScreen
voor het maken en tonen van een SplashScreen zijn een aantal stappen nodig. Vaak worden die in het Project.DPR bestand uitgewerkt. Dit kan de IDE Dialoog Project|Options in de war brengen. Doordat de SplasForm voor Application.Run wordt gesloten wordt een eventuele vertraging in MainForm.Show niet afgedekt, er valt dan een gat tussen het SplashForm en het MainForm.
Maak een nieuw Form, zet Name=frmSplash en sla op als SplashForm.pas
Voor het activeren van het SplashScreen gebruiken we een class procedure in TSplash. De aanroep daarvan is het enige wat nodig is in het hoofd programma blok.
Maak een nieuw Form, zet Name=frmSplash en sla op als SplashForm.pas
Voor het activeren van het SplashScreen gebruiken we een class procedure in TSplash. De aanroep daarvan is het enige wat nodig is in het hoofd programma blok.
... begin Application.Initialize; TfrmSplash.ShowSplash; Application.CreateForm(....); ... Application.Run; end.
De ShowSplash procedure moet het Form cre-eren (Create), tonen (Show) en afdwingen dat het getekend wordt met Update. Het SplashForm moet er zelf zorgen dat het geheugen wordt opgeruimd, dit kan door in het OnClose event de Action op caFree te zetten.
Maak de FormCreate en FormClose events aan. Plaats ook een TTimer en noem deze tmrClose. Maak een OnTimer event aan voor deze Timer.
Maak de FormCreate en FormClose events aan. Plaats ook een TTimer en noem deze tmrClose. Maak een OnTimer event aan voor deze Timer.
class procedure TfrmSplash.ShowSplash; var s : TfrmSplash; begin s := TfrmSplash.Create(Application); s.Show; s.Update; // nodig omdat MessageLoop nog niet draait end; procedure TfrmSplash.FormCreate(Sender: TObject); begin FormStyle := fsStayOnTop; BorderStyle := bsNone; Position := poScreenCenter; tmrClose.Interval := 1000; // duizend is 1 seconde tmrClose.Enabled := true; end; procedure TfrmSplash.tmrCloseTimer(Sender: TObject); begin self.Close; // close het SplashForm end; procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; // laat VCL dit Window opruimen end;
Een Windows-Timer wordt niet Real-Time afgehandeld maar pas als Application.ProcessMessages de message-queue leeg gemaakt heeft wordt gekeken of er Timers zijn afgegaan. Voor dit SplashForm is dit nutig: het Timer-Event kan pas afgaan als het MainForm al volledig getoond is. De interval-waarde in de Timer moet dan ook gezien worden als een minimum.
// pseudocode voor Application.Run procedure TApplication.Run; begin self.MainForm.Show; while not Terminated do ProcessMessages; end;