【问题标题】:Firemonkey do stuff in background Form Delphi 10 SeattleFiremonkey 在后台执行 Form Delphi 10 Seattle
【发布时间】:2016-03-29 07:51:55
【问题描述】:

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

【问题讨论】:

  • 要关闭模态表单,请将其 ModalResult 属性设置为非零值。
  • @RBA 是的,这是真的。但这仍然不能解决我的问题。我的加载屏幕表单没有更新!
  • 表单关闭后调用回调方法。任何人都看不到您在封闭表单上所做的一切
  • @SirRufo 是的,我想。但是我把我的代码放在哪里呢?我也尝试过只显示表单并在之后执行 for 循环,但这也不起作用。

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


【解决方案1】:

在您的第一个代码块中,仅在 loadscreen.modalresult 设置为 0 以外的值后才调用匿名方法。这永远不会发生(我们可以看到)

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

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

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

在此处查看 Marco Cantu 的博文Background Operations on Delphi Android, with Threads and Timers

【讨论】:

  • 感谢您将其标记为答案,即使它不是真正的答案,它只是一个响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多