まず表示に時間がかかるメインフォームとしてこのようなものを考えます。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 99 do
begin
Sleep(100);
end;
end;
起動からメインフォームの表示まで10秒かかります(あたりまえ)。ここでスプラッシュ用のフォームを用意します。必要に応じてプロパティを指定したりLabelやPanelやImageなどを配置してそれなりの体裁を整えていただくとして、ここで必要なイベントハンドラはOnDeactivateです。OnDeactivateイベントハンドラではReleaseメソッドを呼び出してスプラッシュフォーム自身を解放するようにします。
type
TForm2 = class(TForm)
procedure FormDeactivate(Sender: TObject);
end;
procedure TForm2.FormDeactivate(Sender: TObject);
begin
Release;
end;
さらにスプラッシュフォームを表示するためのメソッドを用意します。このスプラッシュフォームには通常の(メッセージループ経由の)メッセージが全く送られない(アプリケーションのメッセージループが動作し始めると直後にOnDeactivateが発生する)ので、Updateメソッドで強制的に表示更新を行う必要があります。procedure ShowSplashForm;
begin
with TForm2.Create(nil) do
begin
Show;
Update;
end;
end;
そしてこのメソッドをプロジェクトソース内のApplication.Initializeの後で呼び出します。begin
Application.Initialize;
ShowSplashForm;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Delphi 2007以降ではWindows Vista対応のためにApplicationとメインフォームの関係を色々と変更したためにbegin
Application.Initialize;
Application.MainFormOnTaskbar := True;
ShowSplashForm;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
とApplication.MainFormOnTaskbarの設定の後にスプラッシュフォームを表示するようにする必要があります(逆にDelphi 2006以前ではTForm2の所属ユニットのinitialization部で十分なのですが)。Applicationの初期化後にまずスプラッシュフォームが生成、表示され、メインフォームが生成されて時間がかかる処理が走り、Apprication.Runでメインフォームが表示されてアクティブになることでスプラッシュフォームはインアクティブになり、OnDeactivateイベントが発生してスプラッシュフォームが消滅する、という動作の流れになります。
0 件のコメント:
コメントを投稿