Fade will not work with standard Timers because application loop will not function until you call Application.Run (as said by Mason), and timers are wrappers for a message based timer API mechanism.
You can't use thread based timers, because it will require Synchronize to work with the UI and Synchronize is message based mechanism.
But you can waste the time required to fade-in/fade out, so you could get a fancy application start and if you're looking for this I freely consider you're not worried about wasting a bit of time. I can explain a lot better with (working and tested) code example, so this will work for you:
USplashForm.pas:
//...
interface
//...
type
TSplashForm = class(TForm)
//...
public
procedure FadeIn;
procedure FadeOut;
//...
end;
//...
implementation
//...
procedure TSplashForm.FadeIn;
begin
AlphaBlend := True;
AlphaBlendValue := 0;
Show;
Update;
repeat
AlphaBlendValue := AlphaBlendValue + 5;
Update;
Sleep(20);
until AlphaBlendValue >= 255;
end;
procedure TSplashForm.FadeOut;
begin
repeat
AlphaBlendValue := AlphaBlendValue - 5;
Update;
Sleep(20);
until AlphaBlendValue <= 5;
Hide;
end;
//...
YourProject.dpr
var
Splash: TSplashForm;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Splash := TSplashForm.Create(nil);
try
Splash.FadeIn;
//any initialization code here!!!
Application.CreateForm(TMainForm, MainForm);
MainForm.Show;
MainForm.Update;
//more code
Sleep(500); //I used it to delay a bit, because I only create one form and I have not initialization code at all!
Splash.FadeOut;
finally
Splash.Free;
end;
Application.Run;
end.
My 5 cents, enjoy.