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;

在我的 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;....

等等!

有什么想法吗?

4

1 回答 1

4

在启动期间在主线程中做繁重的工作(如初始化数据库和许多表单)不适用于启动画面。主线程太忙了,无法对 GUI 做任何事情。将 Sleep 放入代码将不起作用,因为这将停止主线程做任何工作。

这使您有两个选择:

  1. 在另一个线程中进行数据库初始化。有时也只初始化主窗体是一个不错的选择。数据库线程可以通过 PostMessage 调用将进度消息发送到启动表单。

  2. 在单独的线程中启动启动画面。这有点棘手,因为您可能不会从另一个线程使用 VCL。而且您还必须避免阻塞消息队列。幸运的是,下面的彼得做了一个很好的例子,如何只使用 windows api 调用来做一个线程启动屏幕。

在这个 SO 线程中有更多信息:displaying-splash-screen-in-delphi-when-main-thread-is-busy

于 2011-11-19T10:14:48.050 回答