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 10.4.2 : TRoundrect.canvas.endscene Crash (https://www.delphipraxis.net/207967-fmx-10-4-2-troundrect-canvas-endscene-crash.html)

stalkingwolf 21. Mai 2021 13:59


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:
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;
Das ganze ist ein Rect auf dem mit Finger/Stift gezeichnet werden kann.
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 .....

Rollo62 21. Mai 2021 14:24

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
 
Heisst das die App funktioniert, wenn man die Canvas. Zugriffe einfach weglässt ?
Delphi-Quellcode:
...
//   SigRoundRectKunde.canvas.BeginScene;
//   SigRoundRectKunde.canvas.Clear(TAlphaColors.Gray);
//   SigRoundRectKunde.canvas.EndScene;
// Kein Crash, Funktion OK ?
Dann würde ich die auch einfach weglassen, und nur die Fill.Color setzen,
es gibt doch keinen Grund das über Canvas selbst zu machen, oder doch ?

mensch72 22. Mai 2021 01:10

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;

Harry Stahl 22. Mai 2021 09:14

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
 
Eigentlich reicht ein simples

Delphi-Quellcode:
  // ... Whatever here
  RoundRect1.Fill.Color := TAlphaColorrec.gray;
aus, um die Farbe des Roundrect auf Grau zu setzen.

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).

stalkingwolf 25. Mai 2021 07:38

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
 
Moin.

Danke für die Antworten. Werde ich gleich mal testen.

Zitat:

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.
kommt evtl falsch rüber. Das ist ein Button zum leeren. Wenn sich jemand verschrieben hat quasi ein Undo.
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.

himitsu 25. Mai 2021 09:38

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.

stalkingwolf 25. Mai 2021 10:12

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.

Harry Stahl 25. Mai 2021 15:08

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash
 
Zitat:

Zitat von stalkingwolf (Beitrag 1490068)
Mit der Reihenfolge bringt scheinbar nichts.
ich habe die begin und endscene einmal auskommentiert. Es funktioniert auch ohne.

Es KANN funktionieren, muss aber nicht. Außerhalb des OnPaint-Events würde ich zudem die Verwendung von BeginScene wie folgt empfehlen:

Delphi-Quellcode:
  if Canvas.BeginScene then
  try
    Canvas.xxx  //drawing image operations
    ...
  finally
    Canvas.EndScene;
  end;
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).

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:

Zitat von stalkingwolf (Beitrag 1490068)
Das Problem tritt auch nur beim starten auf.
Sobald die APP mal läuft und sichtbar ist funktioniert es einwandfrei.

Klar. Habe ja oben bereits erwähnt, dass die Ausgaben auf dem Canvas der From (das RoundRect ist nur ein Bereich auf der Form und teilt sich den Canvas mit der ganzen Form) flüchtig sind. Bevor die Form nicht sichtbar ist, gehen alle Zeichenaktionen ins Leere...

stalkingwolf 25. Mai 2021 16:13

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 00:30 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