Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Wie render ich auf iOS direkt ohne ProcessMessages aufzurufen? (https://www.delphipraxis.net/207335-wie-render-ich-auf-ios-direkt-ohne-processmessages-aufzurufen.html)

Belphinator 15. Mär 2021 07:48

Wie render ich auf iOS direkt ohne ProcessMessages aufzurufen?
 
Hallo,

ich würde gerne wissen ob es möglich ist auf iOS während eines blockierenden Aufrufes zu rendern ohne ProcessMessages aufzurufen.
Also auf Windows geht das ja mit

Code:
   if Supports(aForm, IPaintControl, PaintControl) then
      PaintControl.PaintRects( UpdateRects );
und auf Android mit

Code:
   if Assigned(aForm) then
   begin
      FormHandle := TAndroidWindowHandle(aForm.Handle);
      if Assigned(FormHandle) then
      begin
         r := TFormRender.create(FormHandle);
         if Assigned(r) then
         begin
            r.Render;
            r.DisposeOf;
            r := nil;
         end;
      end;
   end;
Für iOS sollte es theoretisch auch mit PaintControl.PaintRects gehn wenn ich es mir im Debugger anschaue, aber es passiert dann einfach gar nichts. Hat jemand eine Idee?

Mavarik 15. Mär 2021 12:48

AW: Wie render ich auf iOS direkt ohne ProcessMessages aufzurufen?
 
Eigentlich bin ich kein Freund von Antworten, die die Frage nicht beantworten, aber...

Ein blockierender Aufruf sollte (auf den mobilen Plattformen) NIE im UI-Thread ausgeführt werden.
Aus einem Thread kann man dann mit ForceQueue ein Routine aufrufen, die dann den Redraw-Code ausführt.
Oder - was ich noch lieber mache - im nächsten OnIdle-Event.

Mavarik :coder:

Belphinator 15. Mär 2021 13:16

AW: Wie render ich auf iOS direkt ohne ProcessMessages aufzurufen?
 
Ich weiß das es nicht Best Practice ist aber abgesehen davon das es Monate dauern würde alles umzuschreiben, sehe ich keinen Grund meinen Code mit Threads zu verkomplizieren wenn das genauso geht.

Ich hab jetzt schon ein paar Tage gesucht und jetzt nachdem ich die Frage gestellt habe finde ich die Antwort :lol:

Code:
   if Assigned(aForm) then begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXWindowService, IInterface(WindowSvc)) then
      begin
         WindowSvc.InvalidateImmediately(aForm);
      end;
   end;
Das ruft intern die display Methode vom GLSView auf. Hier kann zugemacht werden.

himitsu 15. Mär 2021 13:44

AW: Wie render ich auf iOS direkt ohne ProcessMessages aufzurufen?
 
Zitat:

Zitat von Belphinator (Beitrag 1485162)
wenn das genauso geht.

Dein Code ging doch nicht :zwinker:

Spätestens wenn mal wieder was Größeres am FMX umgebaut wird, kann dieser Code plötzlich nicht mehr funktionieren.
Da wäre eine "ordentliche" Lösung bestimmt besser.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz