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/)
-   -   Delphi FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken (https://www.delphipraxis.net/198566-fmx-ohne-application-processmessages-neu-malen-inline-bewirken.html)

QuickAndDirty 14. Nov 2018 10:24

FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken
 
Hallo
gibt es in FMX eine Möglichkeit ein Neumalen der Komponenten auszulösen, ohne Application.ProcessMessages aufzurufen?
Es geht mir um ein inline im Hauptthread ausgeführte Darstellungsaktualisierung. z.B. eines Fortschrittbalkens oder Label.text mit "Vorgang gestartet/beendet" Meldung.

Schokohase 14. Nov 2018 10:32

AW: FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken
 
Also du führst im UI Thread eine langwierige Bearbeitung aus (blockierst also diesen Thread) und möchtest da einen Fortschrittsbalken haben.

Richtig?

Dann machst du das falsch.

Führe die Bearbeitung innerhalb eines Threads/Tasks aus und gibt den Fortschritt synchronisiert an den UI Thread.

QuickAndDirty 15. Nov 2018 10:47

AW: FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken
 
Zitat:

Zitat von Schokohase (Beitrag 1418053)
Führe die Bearbeitung innerhalb eines Threads/Tasks aus und gibt den Fortschritt synchronisiert an den UI Thread.

Dessen bin ich mir bewusst.
Es ist ein fertiges großes Crossplattform Projekt.
Ich möchte Processmessages gerade deswegen ausbauen, weil es die Thread synchronisation durcheinander bringt!
Ich möchte selbst bestimmen können das ein Control jetzt gemalt werden soll.

Schokohase 15. Nov 2018 12:04

AW: FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken
 
Wann ein Control neu gemalt wird kannst du nicht wirklich beeinflussen. Du kannst den Inhalt ändern, was dann das Control veranlasst, beim der nächsten Aktualisierungsrunde dabei zu sein.

Diese Aktualisierungsrunde erfolgt immer kurz bevor die Anwendung in den Idle-Zustand kommt (die Anwendung hat nichts zu tun). Diesen Idle-Zustand provozierst du mit Application.ProcessMessages.

Wie du siehst, du kannst nur indirekt auf das Neuzeichnen der Controls einwirken.

Also, was möchtest du jetzt?

QuickAndDirty 15. Nov 2018 13:48

AW: FMX: Ohne Application.ProcessMessages Neu Malen inline bewirken
 
In Windows kann ich mit
Delphi-Quellcode:
PeekMessage(msg, 0, 0, 0, PM_REMOVE)
die Messages die das Control malen filtern (vermutlich WM_PAINT)...und nur die.
Und dann mit
Delphi-Quellcode:
TranslateMessage(msg);
DispatchMessage(msg);
Das malen inline ausführen lassen.

Funktioniert nur in Windows... aber das wäre schonmal ein Anfang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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