RTL (3)

VCL (8)

Debugger (2)

Editor (3)

WIN32 (2)

Voorbeelden (2)

Object Pascal (1)


Over deze site

Nuttige Links


home

[29-11-05]







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.

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

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;


Win32  VCL  Pascal