Firemonkey 在后台 Form Delphi 10 Seattle 中做事
Firemonkey do stuff in background Form Delphi 10 Seattle
我创建了一个弹出加载屏幕表单,我想在 Firmonkey 多设备项目中显示在任何其他表单之上。现在我 运行 遇到了加载屏幕没有根据我在后台表单中所做的事情进行更新的问题。我该如何解决?
下面的代码是我尝试过的示例:
procedure TForm1.Button1Click(Sender: TObject);
var
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen.Create(nil);
loadScreen.ShowModal(
procedure(ModalResult: TModalResult)
var
i:Integer;
begin
for i := 0 to 200 do
begin
loadScreen.CurrentItem := i;
loadScreen.TextMessage := 'Item:' + loadScreen.CurrentItem.ToString;
Sleep(100);
end;
ModalResult := mrCancel;
end);
end;
我想我必须做一些多线程,但我没有这方面的经验!我应该如何为我的加载屏幕执行此操作?
我也试过以下方法,但表格没有显示:
procedure TForm1.Button1Click(Sender: TObject);
var
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen.Create(nil);
loadScreen.OnShow := FormShowLoadScreen;
loadScreen.Show;
end;
procedure TForm1.FormShowLoadScreen(Sender: TObject);
var
i:Integer;
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen(Sender);
for i := 0 to 200 do
begin
loadScreen.CurrentItem := i;
Sleep(100);
end;
loadScreen.Close;
end;
在您的第一个代码块中,匿名方法仅在 loadscreen.modalresult 设置为 0 以外的值后调用。这永远不会发生(我们可以看到)
在你的第二个块中,你有 2 个不同的加载屏幕实例。他们不是同一个人。 FormShowLoadScreen 处理程序在第一个 loadscreen.show 之后调用,但它会创建第二个加载屏幕,它有自己的显示。事实上,这可能发生得如此之快,你根本看不到它发生。
您确实需要了解更多有关 Delphi 多线程的知识。要显示 "progress" 表单,您必须将其处理(显示更新)放在单独线程的同步事件中,该线程在显示加载屏幕表单后立即启动。
实际上...在 FMX 中,在启动匿名线程之前显示动画指示器,然后在线程终止块中再次隐藏它实际上要容易得多。
在此处 Background Operations on Delphi Android, with Threads and Timers
查看 Marco Cantu 的博客 post
我创建了一个弹出加载屏幕表单,我想在 Firmonkey 多设备项目中显示在任何其他表单之上。现在我 运行 遇到了加载屏幕没有根据我在后台表单中所做的事情进行更新的问题。我该如何解决?
下面的代码是我尝试过的示例:
procedure TForm1.Button1Click(Sender: TObject);
var
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen.Create(nil);
loadScreen.ShowModal(
procedure(ModalResult: TModalResult)
var
i:Integer;
begin
for i := 0 to 200 do
begin
loadScreen.CurrentItem := i;
loadScreen.TextMessage := 'Item:' + loadScreen.CurrentItem.ToString;
Sleep(100);
end;
ModalResult := mrCancel;
end);
end;
我想我必须做一些多线程,但我没有这方面的经验!我应该如何为我的加载屏幕执行此操作?
我也试过以下方法,但表格没有显示:
procedure TForm1.Button1Click(Sender: TObject);
var
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen.Create(nil);
loadScreen.OnShow := FormShowLoadScreen;
loadScreen.Show;
end;
procedure TForm1.FormShowLoadScreen(Sender: TObject);
var
i:Integer;
loadScreen:TfrmLoadScreen;
begin
loadScreen := TfrmLoadScreen(Sender);
for i := 0 to 200 do
begin
loadScreen.CurrentItem := i;
Sleep(100);
end;
loadScreen.Close;
end;
在您的第一个代码块中,匿名方法仅在 loadscreen.modalresult 设置为 0 以外的值后调用。这永远不会发生(我们可以看到)
在你的第二个块中,你有 2 个不同的加载屏幕实例。他们不是同一个人。 FormShowLoadScreen 处理程序在第一个 loadscreen.show 之后调用,但它会创建第二个加载屏幕,它有自己的显示。事实上,这可能发生得如此之快,你根本看不到它发生。
您确实需要了解更多有关 Delphi 多线程的知识。要显示 "progress" 表单,您必须将其处理(显示更新)放在单独线程的同步事件中,该线程在显示加载屏幕表单后立即启动。
实际上...在 FMX 中,在启动匿名线程之前显示动画指示器,然后在线程终止块中再次隐藏它实际上要容易得多。
在此处 Background Operations on Delphi Android, with Threads and Timers
查看 Marco Cantu 的博客 post