AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS IOS: Optische Änderungen außerhalb des Mainthreads lösen keine Aktualisierung aus
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von AuronTLG · begonnen am 28. Nov 2022 · letzter Beitrag vom 19. Jan 2023
Antwort Antwort
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
241 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 28. Nov 2022, 11:44
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?
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
240 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 28. Nov 2022, 13:35
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.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
241 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 28. Nov 2022, 14:18
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?
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
241 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 29. Nov 2022, 10:10
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.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 29. Nov 2022, 15:15
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 ?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 29. Nov 2022, 15:29
Ich mache das auch mit TThread.ForceQueue es sei denn es handelt sich um eine Fortschrittsanzeige, dann mit TThread.Queue (ohne force) .
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (29. Nov 2022 um 15:34 Uhr)
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
241 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 29. Nov 2022, 15:43
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.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 29. Nov 2022, 16:46
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.
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 19. Jan 2023, 14:27
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;
Ansgar
  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 10:13 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