4

アプリがデータベースをロードしている間に、アニメーション化されたスプラッシュスクリーンを作成しようとしています。私はすでにスプラッシュスクリーンを作成しましたが、データベースが変換されている間、画像を左から右に「移動」させたいと考えています。しばらく探していましたが、見つけることができたのはプログレスバーに関するものだけです...

これが私のコードです:

SplashScreen := TSplashScreen.Create(Application) ;
SplashScreen.Show;
Application.Initialize;
SplashScreen.Update;
SplashScreen.lblStatus.Caption:='Loading...';
SplashScreen.Update;
SplashScreen.lblStatus.Caption:='Updating database...';
SplashScreen.Update;
Application.Initialize;
Application.CreateForm(TfmMain, fmMain);
Sleep(1000);

Application.CreateForm(TfmPrefs, fmPrefs);
Application.CreateForm(TfmCode, fmCode);
Application.CreateForm(TfmEmps, fmEmps);
Application.CreateForm(TfmRest, fmRest);
Application.ShowMainForm:=FALSE;

SplashScreen.Hide;
SplashScreen.Free;
Application.Run;

私のスプラッシュ スクリーン フォームで、同じ画像の複製を 5 つ作成しました。メイン フォームが作成されている間、画像を表示し、交互に表示しないようにします...例:

while my db loads... begin
Splashscreen.Image1.Visible:=FALSE;
SplashScreen.Update;
Sleep(25);
SplashScreen.Image1.Visible:=FALSE;
SplashScreen.Update;
SplashScreen.Image2.Visible:=TRUE;....

等々!

何かご意見は?

4

1 に答える 1

4

起動時にメイン スレッドで負荷の高い作業 (データベースや多くのフォームの初期化など) を行うと、スプラッシュ スクリーンではうまく機能しません。メイン スレッドが占有されすぎて、GUI で何もできません。Sleep をコードに挿入しても機能しません。これにより、メイン スレッドがまったく作業を停止するからです。

これにより、次の 2 つのオプションが残ります。

  1. 別のスレッドでデータベースの初期化を行います。場合によっては、メイン フォームのみを初期化することも適切なオプションです。データベース スレッドは、PostMessage 呼び出しを介して進行状況メッセージをスプラッシュ フォームに送信できます。

  2. 別のスレッドでスプラッシュ スクリーンを開始します。別のスレッドから VCL を使用できない可能性があるため、これはちょっと注意が必要です。また、メッセージ キューをブロックしないようにする必要があります。幸いなことに、Peter Below は、 Windows API 呼び出しのみを使用してスレッド化されたスプラッシュ スクリーンを実行する方法の良い例を作成しました。

この SO スレッドには、さらにいくつかの情報があります: display-splash-screen-in-delphi-when-main-thread-is-busy

于 2011-11-19T10:14:48.050 に答える