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
Antwort Antwort
Thom

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

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
Thom

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

AW: FireMonkey Sammelthread

  Alt 13. Jul 2013, 18:26
Ich habe gerade beim Lesen der (XE3-)FireMonkey-Quelltexte einen neuen Geniestreich der Entwickler entdeckt:
Delphi-Quellcode:
unit FMX.Platform.Win;

function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
[...]
begin
[...]
        WM_LBUTTONUP:
          begin
            [...]
              GetCursorPos(P);
              ScreenToClient(Wnd, P);
              LForm.MouseUp(TMouseButton.mbLeft, KeysToShiftState(wParam), P.X, P.Y);
            end;
          end;
[...]
end;
Da ist doch tatsächlich jemand auf die Idee gekommen, die Koordinaten aller (!!!) Mausereignisse per GetCursorPos() zur ermitteln, statt aus lParam auszulesen. Im Klartext bedeutet das, daß nicht die tatsächlichen Koordinaten - zum Beispiel bei einem Klick - geliefert werden, sondern die, die bei der Auswertung der Nachricht aktuell sind. Das hat zur Folge, daß bei schnellen Bewegungen oder Verzögerungen auf Grund eines stark beanspruchten Hauptthreads reale und per Ereignishandler gelieferte Werte meilenweit auseinanderliegen können.
Genial!
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: FireMonkey Sammelthread

  Alt 14. Jul 2013, 11:14
Diese Genialität steckt auch noch in XE4. Viel besser jedoch sind die dort enthaltenen TODOs sowie auskommentierten Korrekturversuche.
Zitat:
Hey, hört mal auf zu programmieren, das Marketing hat RTM definiert!
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.682 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FireMonkey Sammelthread

  Alt 14. Jul 2013, 11:29
Wie, das Zitat steht auf deutsch im Quelltext? Ist ja "toll".
Sven Harazim
--
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.877 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FireMonkey Sammelthread

  Alt 15. Jul 2013, 08:24
Zitat:
Und ich hoffe bei Emba mahlt schon mal jemand die neuen Styles für iOS 7.
Stylesmehl als Goodie
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:46 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