2016-03-29 9 views
-2

Ich habe eine Pop-up-Ladebildschirm Formular erstellt, die ich über jede andere Form in einem Firmonkey Multi-Gerät-Projekt zeigen möchte. Jetzt bin ich auf das Problem gestoßen, dass der Ladebildschirm nicht mit den Dingen aktualisiert wird, die ich im Hintergrund Formular mache. Wie kann ich das lösen?Firemonkey tun Zeug im Hintergrund Form Delphi 10 Seattle

Im folgenden Code ist ein Beispiel dafür, was ich versucht habe:

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; 

Ich glaube, ich habe einige Multi-Threading zu tun, aber ich habe keine Erfahrung dies zu tun! Wie soll ich das für meinen Ladescreen machen?

Ich habe auch versucht, die folgende, aber die Form erhält nicht gezeigt:

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

Um ein modales Formular zu schließen, setzen Sie seine Eigenschaft ModalResult auf einen Wert ungleich Null. – RBA

+0

@RBA Ja, das stimmt. Aber das löst mein Problem nicht. Mein Ladebildschirm wird nicht aktualisiert! – Remi

+0

Die Callback-Methode heißt ** nachdem ** das Formular geschlossen wurde. Alles, was Sie dort im geschlossenen Formular tun, ist für niemanden sichtbar. –

Antwort

1

In Ihrem ersten Codeblock, die annonymous Methode wird erst nach loadscreen.modalresult aufgerufen etwas gesetzt ist anders als 0. Das passiert nie (das können wir sehen)

In Ihrem zweiten Block haben Sie 2 verschiedene Loadscreen-Instanzen. Sie sind nicht die gleichen. Der FormShowLoadScreen-Handler wird nach der ersten loadscreen.show aufgerufen, aber es erstellt einen zweiten Ladebildschirm mit eigenen Anzeigen. In der Tat könnte dies so schnell passieren, Sie würden es nicht passieren sehen.

Sie müssen wirklich mehr über Delphi Multithreading lernen. Um ein "Fortschritt" -Formular anzuzeigen, müssen Sie seine Verarbeitung (Anzeigeaktualisierungen) innerhalb des Synchronisierungsereignisses eines separaten Threads ablegen, der gestartet wird, unmittelbar nachdem das Ladescreen-Formular angezeigt wird.

Eigentlich ... Es ist tatsächlich viel einfacher in FMX, einen Animationsindikator anzuzeigen, bevor ein anonymer Thread gestartet wird, und ihn dann im Thread-Beendigungsblock wieder auszublenden.

See Marco Cantu Blog-Post hier Background Operations on Delphi Android, with Threads and Timers

+0

Danke, dass Sie das als Antwort markiert haben, obwohl es nicht wirklich eine Antwort war, es war nur eine Antwort. – nolaspeaker