2011-02-01 9 views
2

私のアプリケーションでは、データベースへの接続やその他の初期化中にスプラッシュイメージがあります。スプラッシュイメージを表示するのにうまく動作しますが、そこにはピリオドが空白です。 だから、スプラッシュイメージが数秒間空白になっています

  1. スプラッシュイメージがロードされ、秒単位で表示されます。
  2. スプラッシュ画像が2〜3秒間空白になっています。
  3. スプラッシュ画像がもう一度表示されます。
  4. スプラッシュが閉じています。

できるだけ早く画像を表示し、空白の画像を削除するという賢いことがありますか?

DPR-ファイル内のコード:

Application.Initialize; 

SplashForm := TSplashForm.Create(Application); 
SplashForm.Show; 
// Tried Splash.Update here but no difference. 

SplashForm.SetPos(15); 
// Init code 
SplashForm.SetPos(30); 

// More Init code 
SplashForm.SetPos(100); 

SplashForm.Close; 

Application.Run; 

スプラッシュ単位:

procedure TSplashForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TSplashForm.FormCreate(Sender: TObject); 
begin 
    pbLoading.Properties.Text := 'Loading ' + TClientConfig.Instance.AppTitle + '...'; 
end; 

procedure TSplashForm.SetPos(aPos: Integer); 
begin 
    pbLoading.Position := aPos; 
    UpDate; 
end; 

よろしく ローランド

答えて

9

あなたSplashFormを示すためにWM_PAINTメッセージを受信する必要がありますメッセージポンプが動作していなければ、それは起こりません。

Application.ProcessMessagesSplashForm.Showの後に置きます。

+3

実際にUpdate()は同じ同期を実行します。メッセージループはその時点で既に存在しますが、VCLスレッドは無効化済みのウィンドウを描画する機会はありません。 –

+0

ありがとうございます。それは右のように聞こえるが、違いはない。何かが長い時間を要し、スプラッシュイメージをクリアするようです。 –

+0

ProcessMessages()は待機しません。 HandleMessage()は –

0

おそらく、これは明らかではありませんが、コードがスプラッシュ画面を表示してすぐに閉じるように見えます。 SplashForm.Closeという行をコメントアウトするとどうなりますか?

+0

私はコードを少し簡略化しました。 initコードの後ろにDatamoduleCreateを呼び出すことがあります。それはモデルをロードし、時間がかかる。これが終わったら私はスプラッシュを閉じたいです。 –

+0

@Rolandあなたが取り出したコードのビットは、私たちが問題を解決するのを可能にする重要なビットでした! –

0

私は今それを理解すると思います。私のアプリケーションはBoldを使用しており、モデルの読み込みには数秒かかります。その間スプラッシュは空白です。私はその時間を少し減らしましたが、Bolds SetFromModelの内部をApplication.ProcessMessagesで混乱させたくありません。

これは大丈夫だと思います。しかし、あなたのコメントに感謝します。私は正しい方向に向いています。

/Roland

関連する問題