Fadeは、Application.Runを呼び出すまでアプリケーションループが機能しないため(Masonによると)、標準のタイマーでは機能しません。タイマーは、メッセージベースのタイマーAPIメカニズムのラッパーです。
スレッドベースのタイマーは使用できません。UIを操作するにはSynchronizeが必要であり、Synchronizeはメッセージベースのメカニズムであるためです。
ただし、フェードイン/フェードアウトに必要な時間を無駄にする可能性があるため、豪華なアプリケーションを開始できます。これを探している場合は、少し時間を無駄にする心配はないと思います。私は(動作し、テストされた)コード例ではるかによく説明できるので、これはあなたのために動作します:
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.
私の5セント、お楽しみください。