使用Delphi 7创建动画启动画面

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;....

and so on!

Any thoughts?


你的问题具体是什么?由于你在主线程中执行所有操作,两个代码片段中的 Sleep 都会暂停整个应用程序(包括 while my db loads 代码)。换句话说,当你期望它更新图像显示时,通过将线程暂停来停止了应用程序。 - Ken White
原帖,正如Ken建议的:) - 嗯,为什么不尝试使用GIF图像呢?要在表单上显示动画GIF,您可以考虑使用TGifImage,从这里访问:http://www.tolderlund.eu/delphi/ - Pateman
顶部代码片段中的SLeep(1000)仅用于显示我的启动屏幕,并且在应用程序完成时将被删除...它存在是为了让我实际看到启动屏幕。第二个存在是为了使图像至少停留25毫秒,以便它们不会出现为托盘。 - Gab
@Pateman,谢谢,但我不想让它动画化,我只想让第一张图片可见,然后不可见,然后右边的那张就会出现,以此类推...抱歉如果我表达不清楚! - Gab
你可能正在寻找一个线程化的启动画面。Peter Below的这个启动画面非常受欢迎:Delphi的线程化启动画面 - LU RD
显示剩余2条评论
1个回答

4
在启动期间在主线程中执行繁重的工作(如初始化数据库和许多表单)与闪屏界面不兼容。主线程太忙于处理 GUI,将 Sleep 放入代码中也无法解决问题,因为这会完全停止主线程的所有工作。
这留下了两个选择:
1. 在另一个线程中执行数据库初始化。有时仅初始化主窗体是一个好选择。数据库线程可以通过 PostMessage 调用向闪屏窗体发送进度消息。
2. 在单独的线程中启动闪屏界面。这有点棘手,因为您可能不能从另一个线程使用 VCL。同时还必须避免阻塞消息队列。幸运的是,Peter Below 已经做出了一个很好的示例,展示了如何仅使用 Windows API 调用来实现 带线程的闪屏
在这个 SO 线程中还有一些更多信息:displaying-splash-screen-in-delphi-when-main-thread-is-busy

@KenWhite,谢谢。也许我应该提到选项1是一种通用解决方案,而选项2可能取决于Windows版本。 - LU RD
@TOndrej,#1可能是个问题。对于我所使用的每个数据库,数据库连接都是基于线程的,因此在单独的线程中初始化意味着一旦初始化完成,主线程将无法访问该连接(当然,除非您设置了在次要线程和主线程之间通信的方法,这是一个完全不同的话题<g>)。 - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接