2016-03-29 86 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

相關問題