AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FireMonkey Sammelthread

Ein Thema von mquadrat · begonnen am 1. Sep 2011 · letzter Beitrag vom 27. Jul 2013
 
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#32

AW: FireMonkey Sammelthread

  Alt 13. Jul 2013, 14:32
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!
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (13. Jul 2013 um 14:53 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz