2011-11-18 84 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可能是一个问题。数据库连接(对于我曾经使用过的每个数据库)都是每个线程,因此在单独的线程中初始化意味着初始化完成后主线程将无法访问该连接(当然,除非您建立了二级和主线程之间的沟通方式,这是一个完全不同的主题)。 –