Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus (https://www.delphipraxis.net/211975-ios-optische-aenderungen-ausserhalb-des-mainthreads-loesen-keine-aktualisierung-aus.html)

AuronTLG 28. Nov 2022 11:44

IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Moin,

ich wollte mal ein Problem ansprechen, dass ich schon länger habe, aber bisher immer umschiffen konnte:
Auf IOS scheinend optische Änderungen, die irgendwie außerhalb des Mainthreads stattfinden, keine Aktualisierung der Anzeige auszulösen.
Einfaches Beispiel:
Ich mache einen NFC-Scan. Der NFC-Scan löst ein Rückgabe-Event aus, in welchem der Text von einem Label geändert wird. Die Änderung hat zwar stattgefunden, wird aber nicht angezeigt, bis man durch etwas wie etwa das Umschalten einer TabControl ein allgemeines Repaint auslöst.
Es spielt keine Rolle, was ich tue. Repaints, ProcessMessages, Timer, rumhantieren mit Queue oder Synchronize und etliche andere Spielereien bringen überhaupt nichts.

Hat sonst noch wer dieses Problem bzw weiß eine Lösung?

jziersch 28. Nov 2022 13:35

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Den Effekt hast du in FMX sogar bei einfachen Button Clicks.

Ich verwende für sowas einen Boolean (o.ä. je nach Komplexität) der in einem Timer event abgefragt zu einen Repaint führt. Ein solcher Marker kann auch Prima in einem Thread gesetzt werden, man vermeidet damit Synchronize.

AuronTLG 28. Nov 2022 14:18

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Hm, ich habe das mal mit einem Timer und einem Label probiert, hat aber nicht funktioniert.

Den Timer habe ich sicherheitshalber von Anfang an aktiviert und dann die entsprechende Boolean in der NFC-Scan-Rückgabemethode auf true gesetzt.
Im Timerevent wurde ein Repaint auf das Label gemacht. Die Textänderung kommt trotzdem erst durch, wenn ich durch meine Interaktion mit der App ein Repaint auslöse.

Muss man sonst noch etwas beachten bei, evtl mit dem Repaint?

AuronTLG 29. Nov 2022 10:10

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Ich habe gerade einen etwas seltsamen Workaround für das Problem gefunden:
Alles was man braucht, ist ein Memo, was auf Readonly sitzt sowie eine normale Form-Methode, welche ein SetFocus auf dieses Memo ausführt.
Mit dieser Methode kann man dann nämlich ein Repaint auslösen, wann man will. D.h. ich mache meine optischen Änderungen, rufe die Methode auf und meine optischen Änderungen werden verarbeitet und angezeigt.
Dabei spielt es keine Rolle ob das Memo nur 1 Pixel hoch und damit quasi unsichtbar ist.

Rollo62 29. Nov 2022 15:15

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Ich weiss nicht genau ob Du das meinst, ich entkoppele das meistens so:

Delphi-Quellcode:
procedure TMyForm.OnNfcResult( AText : String );
var
    LText : String;
begin
    LText := AText; // Zusätzliche Sicherheit zum Entkoppeln des Strings, sollte nicht unbedingt nötig sein
    TThread.ForceQueue( nil,
        procedure
        begin
            Label1.Text := LText;
            Label1.Repaint; // Wenn die Zuweisung nicht reicht.
        end );
end;
Mit dem ForceQueue versichere ich dass das Label egal aus welchem Kontext korrekt im MainUI angesprochen wird.
Ich habe verschiedene externe Events wo man nicht immer 100% sicher sagen kann ob es im MainUI ankommt.
Vielleicht löst das Deinen Fall, wenn ich den richtig verstanden habe ?

QuickAndDirty 29. Nov 2022 15:29

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Ich mache das auch mit TThread.ForceQueue es sei denn es handelt sich um eine Fortschrittsanzeige, dann mit TThread.Queue (ohne force) .

AuronTLG 29. Nov 2022 15:43

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Ich habe es gerade nochmal mit ForceQueue probiert, aber das tut bei mir rein gar nichts.
Funktioniert das so bei euch wirklich auf IOS?
Auf Android habe ich keine Probleme, aber bei IOS ist der oben beschriebene Workaround momentan das einzige, womit ich das Problem umgehen kann.

Rollo62 29. Nov 2022 16:46

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Du könntest versuchen nicht das Label sondern den Parent ( die Form ? ) zu repainten.
Manchmal reagieren die Repaints nicht, das habe ich auch schon gesehen, warum auch immer.

Delphi-Quellcode:
    Label1.Text := LText;
****//Label1.Repaint; // Wenn die Zuweisung nicht reicht.
    Self.Repaint;
In FMX wird sowieso der ganze Form/Frame neu gerendert, deshalb macht das nichts.

angos 19. Jan 2023 14:27

AW: IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
 
Hey,

wir haben bei uns das gleiche Problem gehabt. Wir haben das folgendermaßen lösen können
Delphi-Quellcode:
procedure TNFCReader.OnHide;
begin
  [...]
  WindowHandleToPlatform(Application.MainForm.Handle).View.setNeedsDisplay;
end;


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