【发布时间】:2023-12-24 08:10:01
【问题描述】:
我正在使用队列在 Delphi 应用程序初始化中创建许多表单,但它不能正常工作。
下面是一段代码
TThread.Queue(TThread.CurrentThread,
procedure()
begin
Application.CreateForm(TForm1, form1);
Application.CreateForm(TForm2, form2);
Application.CreateForm(TForm3, form3);
.....
Application.CreateForm(TForm9, form9);
Application.CreateForm(TDatamodule1, datamodule1);
end);
我希望在progressBar和label中显示创建的进度。例如:
对于最终创建的每个 Tform,我设置 TProgressBar.Value=TProgressBar.Value + 10,并为下一个 Form 更新 label.text:'loading form2...'
该应用程序适用于 Windows 和 Android。我在这两个平台上看到的相同行为,屏幕冻结并在进程结束时更新“加载完成”。我做错了什么?
注意:上次我使用的是 Synchronize,但我无法在 TTHread 上下文中创建 Forms,然后 Synchronize 是访问全局 var Form1 和更新标签所必需的,这不是一个好主意。
完整的代码,
TfrmSplash.create(Sender:TObject);
begin
TThread.Queue(TThread.CurrentThread,
procedure()
begin
Application.CreateForm(TForm1, form1);
TProgressBar.Value=TProgressBar.Value + 10
Label1.text:='Loading form2';
Application.CreateForm(TForm2, form2);
TProgressBar.Value=TProgressBar.Value + 10
Label1.text:='Loading form3';
Application.CreateForm(TForm3, form3);
TProgressBar.Value=TProgressBar.Value + 10
Label1.text:='Loading form4';
.....
Application.CreateForm(TForm9, form9);
TProgressBar.Value=TProgressBar.Value + 10
Label1.text:='Loading data';
Application.CreateForm(TDatamodule1, datamodule1);
TProgressBar.Value:=100
Label1.text:='100% complete';
Sleep(200);
frmSplash.hide;
Form1.show;
end);
end;
【问题讨论】:
-
XE 不支持 Android 或 Firemonkey。有时了解您使用的版本很有用。对这些细节要精确。我在你的最后一个问题中解释了很多。请务必注意这一点。至于问题,我们确实需要清楚地了解这段代码执行的上下文。所以请提供minimal reproducible example。
-
你错了,从Delphi Xe2开始支持Firemonkey和Android。该代码适用于 xe7、xe5 和 xe2。我会改进代码给你帮助我。
-
XE 是 XE2 之前的版本。它仅针对 Windows。我们需要一个minimal reproducible example。请提供一份。
-
为什么不简单地使用“Application.Processmessage;”命令 ? (这取决于在后台做了什么?并且可能会干扰启动画面?)
标签: android windows multithreading firemonkey delphi-xe