我创建了一个弹出式加载屏幕表单,我想在Firmonkey Multi设备项目中的任何其他表单上方显示。现在我遇到了一个问题,即加载屏幕没有更新我在后台表单中所做的事情。我该如何解决这个问题?
以下代码是我尝试过的一个例子:
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;
答案 0 :(得分:1)
在你的第一个代码块中,只有在loadscreen.modalresult被设置为0以外的值之后才会调用annonymous方法。这种情况永远不会发生(我们可以看到)
在第二个块中,您有2个不同的loadscreen实例。它们不是同一个。 FormShowLoadScreen处理程序在第一次loadscreen.show之后调用,但它创建了第二个加载屏幕,它有自己的显示。事实上,这可能会发生得如此之快,你不会发生这种情况。
您真的需要了解有关Delphi多线程的更多信息。要显示“进度”表单,您必须将其处理(显示更新)放在单独线程的同步事件中,该线程在显示加载屏幕窗体后立即启动。
实际上......在开始一个匿名线程之前,在FMX中显示动画指示器实际上要容易得多,然后在线程终止块中再次隐藏它。
请参阅Marco Cantu的博客文章Background Operations on Delphi Android, with Threads and Timers