Seid mal nicht ganz so streng.
Auch in der
VCL funktioniert die grafische Ausgabe nicht, solange die Nachrichtenverarbeitung blockiert wird. Hier hilft ja bekanntlich der Aufruf von
Application.ProcessMessages
, was auch unter FireMonkey möglich ist. Dann werden auch alle Animationen abgearbeitet und Veränderungen des Formulars sichtbar gemacht.
Wer aus irgendwelchen Gründen
Application.ProcessMessages
nicht verwenden möchte (zum Beispiel, damit der Anwender nicht inzwischen wild auf dem Formular herumklicken kann) könnte auch folgenden Classhelper verwenden, der nur die Animationen weiterlaufen läßt und veränderte Elemente aktualisiert:
Delphi-Quellcode:
type
TCustomFormHelper = class helper for TCustomForm
procedure Repaint;
end;
procedure TCustomFormHelper.Repaint;
var
N: Integer;
UpdateRect: TRectF;
Child: TFmxObject;
begin
if Assigned(FMX.Types.AniThread) and Assigned(FMX.Types.AniThread.OnTimer)
then FMX.Types.AniThread.OnTimer(nil);
if ChildrenCount>0 then
begin
UpdateRect:=TRectF.Empty;
for N:=0 to ChildrenCount-1 do
begin
Child:=Children[N];
if (Child is TControl) and not TControl(Child).UpdateRect.IsEmpty then
begin
if UpdateRect.IsEmpty
then UpdateRect:=TControl(Child).UpdateRect
else UpdateRect.Union(TControl(Child).UpdateRect);
end;
end;
if not UpdateRect.IsEmpty
then PaintRects([UpdateRect]);
end;
end
Verwendet werden könnte er wie in meinem
ersten Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Time: Cardinal;
begin
AniIndicator1.Visible:=true;
AniIndicator1.Enabled:=true;
try
Time:=TThread.GetTickCount;
while TThread.GetTickCount-Time<=5000 do
begin
Sleep(50);
Label1.Text:=FloatToStr(TThread.GetTickCount-Time);
Repaint;
//Application.ProcessMessages;
end;
finally
AniIndicator1.Visible:=false;
AniIndicator1.Enabled:=false;
end;
end;
P.S.:
TProgressBar funktioniert damit übrigens auch ohne Probleme!