![]() |
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? |
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. |
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? |
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. |
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:
Mit dem ForceQueue versichere ich dass das Label egal aus welchem Kontext korrekt im MainUI angesprochen wird.
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; 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 ? |
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) .
|
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. |
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:
In FMX wird sowieso der ganze Form/Frame neu gerendert, deshalb macht das nichts.
Label1.Text := LText;
****//Label1.Repaint; // Wenn die Zuweisung nicht reicht. Self.Repaint; |
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 20:48 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