2016-03-29 56 views
-2

我创建了一个弹出式加载画面窗体,我想在Firmonkey多设备项目中的任何其他窗体上方显示。现在我遇到了加载屏幕不会更新我在背景窗体中做的事情的问题。我该如何解决这个问题?Firemonkey做背景的东西形式德尔福10西雅图

在下面的代码是什么,我已经试过一个例子:

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

要关闭模式窗体,其ModalResult属性设置为非零值。 – RBA

+0

@RBA是的,的确如此。但仍然不能解决我的问题。我的载入画面表单不会更新! – Remi

+0

在窗体关闭后,回调方法被调用**。你在封闭表格上做的所有事情都不会被任何人看到 –

回答

1

在你的第一个代码块,后loadscreen.modalresult被设定为比其他东西annonymous方法只叫0.这绝不会发生(我们可以看到)

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

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

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

见马可坎的博客文章在这里Background Operations on Delphi Android, with Threads and Timers

+0

感谢您将此标记为答案,即使这不是一个真正的答案,但这只是一个回应。 – nolaspeaker

相关问题