You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireMonkey中带进度提示的启动闪屏问题求助

解决Delphi闪屏TLabel仅显示最后一条进度提示的问题

这个问题我之前也碰到过,核心原因很简单:在Application.Run执行之前,主线程还没有进入消息循环。你设置Label的Caption后,控件的重绘消息(WM_PAINT)根本没机会被处理,哪怕加了Sleep,也只是让线程休眠,不会触发界面更新。直到所有初始化代码执行完,Application.Run启动消息循环,才会一次性把最后一次的Caption绘制出来。

下面给你两种靠谱的解决方法:

方法1:强制控件立即重绘

每次更新Label的文本后,调用控件的Update方法,它会直接触发控件的重绘操作,不需要等待消息循环。

假设你的ShowProgress方法是用来更新提示文本的,修改它:

procedure TFormSplash.ShowProgress(const TaskMsg: string);
begin
  // 设置新的提示文本
  LabelProgress.Caption := TaskMsg;
  // 强制Label立即重绘,显示新文本
  LabelProgress.Update;
end;

然后你的初始化代码可以保持类似这样的结构:

Application.Initialize;
FormSplash := TFormSplash.Create(Application);
FormSplash.Show; // 确保闪屏显示出来(如果你的OpenSplash已经做了这件事就不用重复)

// 依次执行初始化任务并更新提示
FormSplash.ShowProgress('Starting up databases');
Sleep(800); // 模拟数据库初始化耗时(实际项目替换成真实代码)

FormSplash.ShowProgress('Setting up forms');
Sleep(600); // 模拟表单初始化

// ...其他初始化步骤

// 初始化完成后关闭闪屏
FormSplash.Close;
FormSplash.Free;

Application.Run;

方法2:处理待处理的消息队列

如果你的闪屏还有其他控件需要更新(比如进度条),可以用Application.ProcessMessages代替控件的Update,它会处理所有待处理的Windows消息,包括重绘、鼠标事件等:

procedure TFormSplash.ShowProgress(const TaskMsg: string);
begin
  LabelProgress.Caption := TaskMsg;
  // 处理所有待处理消息,确保界面及时更新
  Application.ProcessMessages;
end;

⚠️ 注意:使用Application.ProcessMessages时要小心,如果用户在初始化期间点击闪屏的关闭按钮,可能会导致程序异常。可以在闪屏Form的OnCloseQuery事件里禁用关闭:

procedure TFormSplash.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // 初始化完成前不允许关闭闪屏
  CanClose := False;
end;

等所有初始化任务完成后,再允许关闭或者直接销毁闪屏即可。

内容的提问来源于stack exchange,提问作者user2383818

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:27:19