Firemonkey在背景形式德尔福10西雅图做东西

时间:2016-03-29 07:51:56

标签: delphi background popup firemonkey delphi-10-seattle

我创建了一个弹出式加载屏幕表单,我想在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;

1 个答案:

答案 0 :(得分:1)

在你的第一个代码块中,只有在loadscreen.modalresult被设置为0以外的值之后才会调用annonymous方法。这种情况永远不会发生(我们可以看到)

在第二个块中,您有2个不同的loadscreen实例。它们不是同一个。 FormShowLoadScreen处理程序在第一次loadscreen.show之后调用,但它创建了第二个加载屏幕,它有自己的显示。事实上,这可能会发生得如此之快,你不会发生这种情况。

您真的需要了解有关Delphi多线程的更多信息。要显示“进度”表单,您必须将其处理(显示更新)放在单独线程的同步事件中,该线程在显示加载屏幕窗体后立即启动。

实际上......在开始一个匿名线程之前,在FMX中显示动画指示器实际上要容易得多,然后在线程终止块中再次隐藏它。

请参阅Marco Cantu的博客文章Background Operations on Delphi Android, with Threads and Timers