![]() |
FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Ich übersetze gerade mein 10.1 FMX Android APP unter 10.4.2
Dazu nutze ich das Android 32 Biut SDK 25.2.5 was bei 10.4.2 dabei ist. Wenn ich das APP auf meinem alten Tablet mit Android 8 laufen lasse dann hängt es in einer Endlosschleife. Mit einem virtuellen Gerät mit SDK 30 in Android Studio erstellt stürzt das App ab. Und das Problem scheint TRoundcrect.canvas.endScene zu sein. Mein Quellcode :
Code:
Das ganze ist ein Rect auf dem mit Finger/Stift gezeichnet werden kann.
procedure TForm.bbSignatureKundeClearClick(Sender: TObject);
begin FreeandNil(SignatureKunde); SignatureKunde := TList<TSigCapRec>.Create; SigRoundRectKunde.Canvas.Clear(SigRoundRectKunde.Fill.Color); SigRoundRectKunde.Repaint; SigRoundRectKunde.canvas.BeginScene; SigRoundRectKunde.canvas.Clear(TAlphaColors.Gray); SigRoundRectKunde.canvas.EndScene; // Crash? end; Die Funktion leert das Rect und funktioniert 1a wenn ich es mit 10.1 und dem alten SDK ( glaub 14) übersetze. Es funktioniert auch unter Windows. und warum hängt das Android APP dann in einer Endlos Bootschleife. Formcreate -> Formactivate -> Crash -> Formcreate -> Formactivate -> Crash ..... |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Heisst das die App funktioniert, wenn man die Canvas. Zugriffe einfach weglässt ?
Delphi-Quellcode:
Dann würde ich die auch einfach weglassen, und nur die Fill.Color setzen,
...
// SigRoundRectKunde.canvas.BeginScene; // SigRoundRectKunde.canvas.Clear(TAlphaColors.Gray); // SigRoundRectKunde.canvas.EndScene; // Kein Crash, Funktion OK ? es gibt doch keinen Grund das über Canvas selbst zu machen, oder doch ? |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
"SigRoundRectKunde.Repaint"... das stößt intern doch "verzögert/async" ein neuzeichnen an... da ist es keine gute Idee gleich danach weitere harte Canvas Zugriffe zu machen (Unter Windows könnte man da böse hinter das Repaint ein Application.ProcessMessages "zum warten" einfügen)
Code:
procedure TForm.bbSignatureKundeClearClick(Sender: TObject);
begin FreeandNil(SignatureKunde); SignatureKunde := TList<TSigCapRec>.Create; SigRoundRectKunde.Canvas.Clear(SigRoundRectKunde.Fill.Color); SigRoundRectKunde.Repaint; SigRoundRectKunde.canvas.BeginScene; SigRoundRectKunde.canvas.Clear(TAlphaColors.Gray); SigRoundRectKunde.canvas.EndScene; // Crash? end; aus meiner Sicht logischer wäre:
Code:
procedure TForm.bbSignatureKundeClearClick(Sender: TObject);
begin FreeandNil(SignatureKunde); SignatureKunde := TList<TSigCapRec>.Create; SigRoundRectKunde.canvas.BeginScene; SigRoundRectKunde.Canvas.Clear(SigRoundRectKunde.Fill.Color); // die Zeile macht aus meiner Sicht wenig Sinn, weil danach das ja nochmal fix mit grau gemacht wird SigRoundRectKunde.canvas.Clear(TAlphaColors.Gray); SigRoundRectKunde.canvas.EndScene; SigRoundRectKunde.Repaint; end; |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Eigentlich reicht ein simples
Delphi-Quellcode:
aus, um die Farbe des Roundrect auf Grau zu setzen.
// ... Whatever here
RoundRect1.Fill.Color := TAlphaColorrec.gray; Davon abgsehen ist es gar keine gute Idee - weder unter Windows VCL, noch unter FMX - direkte Zeichenaktionen auf Canvas von Objekten im Klick-Event zu machen. Dafür sind die Onpaint-Events da, da sollen sich die Objekte selber neu zeichnen. Falls man da was spezielles zeichnen will, kann man das da aber auch tun, aber eben nur da. Alles andere macht auch keinen Sinn, da Zeichenausgaben auf dem Canvas nur flüchtig sind. Wenn Du in einem Button-Event auf dem Canvas des Controls malst, reicht es schon, ein anderes Formular über das Control zu ziehen, schon sind Deine Malaktionen verloren. Oder das Form erhält aus irgendeinem Grund den Auftrag sich neu zu zeichnen, auch da gehen Deine Zeichnungen aus dem OnClick-Event verloren. Ansonsten würde ich nur die Objekte wie gewünscht verändern und dann einfach nur das Objekt sich neu zeichnen lassen. Manchmal kriegt man das nur mit Control.beginupdate; Control.endupdate; hin (wobeil Control hier steht z.B. für Stringgrid, Troundrecht, was auch immer). |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Moin.
Danke für die Antworten. Werde ich gleich mal testen. Zitat:
Ich rufe dies aber immer beim laden eines Datensatzes auf um eine leere Fläche zu haben und der erste Datensatz in der APP wird beim activate der APP aufgerufen. Sobald die APP läuft ist das auch kein Problem. Da funktioniert alles 1a. |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
In der VCL prinzipiell ist es überhaupt keine gute Idee, direkt auf den Canvas von irgendwas zu Zeichnen, (außer beim Bitmap im TImage)
ohne dass man im OnPaint eine Neuzeichnen-Funktion hat. Wie die 3D-Enginge im FMX das handhabt, weiß ich nicht genau. |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Mit der Reihenfolge bringt scheinbar nichts.
ich habe die begin und endscene einmal auskommentiert. Es funktioniert auch ohne. Das Problem tritt auch nur beim starten auf. Sobald die APP mal läuft und sichtbar ist funktioniert es einwandfrei. |
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Zitat:
Delphi-Quellcode:
So weißt Du, ob die Ausgabe möglich war oder nicht (und kannst im letzten Falle Maßnahmen ergreifen um einen erneuten Versuch zu starten).
if Canvas.BeginScene then
try Canvas.xxx //drawing image operations ... finally Canvas.EndScene; end; Das ist übrigens ein weiterer Vorteil der Verwendung des OnPaint-Events: Da musst Du BeginScene nicht verwenden, da das System vor Aufruf des Onpaint-Events das selber macht und insofern IMMER sichergestellt ist, dass Deine Zeichenausgaben erfolgen. Zitat:
|
AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
Danke, das hat geholfen.
Das weglassen vom begin und endscene hat auch dafür gesorgt das es nicht direkt sichtbar war. Sondern erst wenn wieder was gezeichnet wurde. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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