2008年12月11日

スプラッシュフォームを表示する

メインフォームを表示するのに時間がかかる(データベースを参照していたり、大きなファイルを読み込む必要があったり、理由はさまざまでしょうけれども)ようなときに、スプラッシュフォームを表示することでこれをごまかす、じゃなくて目立たなくするという方法があります。
まず表示に時間がかかるメインフォームとしてこのようなものを考えます。
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 件のコメント: