2011-11-18 80 views
4

我試圖讓我的應用程序加載他的數據庫時動畫splashscreen。 我已經創建了一個splashscreen,但是我想讓圖像在數據庫轉換時從左向右「移動」。一直在尋找了一段時間了,但所有我能找到的是一個關於進度條...創建動畫splashscreen德爾福7

這裏是我的代碼:

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; 

在我splashscrren形式,我創建5次重複相同的圖像,並同時主創建表格,我希望圖像可見並且不可見,例如:

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

等等!

有什麼想法?

+0

你的問題到底是什麼?至少在調用Sleep的過程中,因爲您正在執行主線程中的所有內容,因此您的代碼片段中的'Sleep'會暫停整個應用程序(包括'while db db loads'代碼)。 IOW,當你期望它更新圖像顯示時,通過暫停線程來停止你的應用程序。 –

+0

正如Ken建議的原文:) - 嗯,你爲什麼不嘗試使用GIF圖像呢?要在您的表單上顯示動畫GIF,您可以考慮使用TGifImage,可從以下位置訪問:http://www.tolderlund.eu/delphi/ – Pateman

+0

頂級片段中的SLeep(1000)僅用於顯示我的splashscreen並將被移除當應用程序完成時......它在那裏讓我真正看到splashscreen。第二個是在那裏,以便圖像保持至少25毫秒,以便它們不會顯示爲托盤。 – Gab

回答

4

在啓動過程中在主線程中執行繁重的工作(如初始化數據庫和許多窗體) 對於啓動畫面無法正常工作。主線程被佔用,無法對GUI執行任何操作。將Sleep放入代碼將不起作用,因爲這會阻止主線程完成任何工作。

這使你有兩個選擇:

  1. 做你的數據庫初始化在另一個線程。 有時候也只是初始化主窗體是一個不錯的選擇。 數據庫線程可以通過PostMessage調用將進度消息發送到啓動窗體。

  2. 在單獨的線程中啓動啓動畫面。這有點棘手,因爲你可能不會使用另一個線程中的VCL。 而且你也必須避免阻塞消息隊列。 幸運的是,Peter Below已經做出了一個很好的例子,那就是如何僅使用windows api調用threaded splash screen

這條線索還有一些更多的信息:displaying-splash-screen-in-delphi-when-main-thread-is-busy

+0

+1。很好的評論擴展。 :) –

+0

@KenWhite,謝謝。也許我應該提到選項1是一個通用的解決方案,而選項2可能取決於Windows版本。 –

+0

@TOndrej,#1可能是一個問題。數據庫連接(對於我曾經使用過的每個數據庫)都是每個線程,因此在單獨的線程中初始化意味着初始化完成後主線程將無法訪問該連接(當然,除非您建立了二級和主線程之間的溝通方式,這是一個完全不同的主題)。 –