AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX 10.4.2 : TRoundrect.canvas.endscene Crash

Ein Thema von stalkingwolf · begonnen am 21. Mai 2021 · letzter Beitrag vom 25. Mai 2021
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#1

FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 21. Mai 2021, 14:59
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 .....

Geändert von stalkingwolf (21. Mai 2021 um 15:16 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 21. Mai 2021, 15:24
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 ?
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#3

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 22. Mai 2021, 02:10
"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;
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 22. Mai 2021, 10:14
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).
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#5

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 25. Mai 2021, 08:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 25. Mai 2021, 10:38
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.
$2B or not $2B
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#7

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 25. Mai 2021, 11:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 25. Mai 2021, 16:08
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.

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...
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#9

AW: FMX 10.4.2 : TRoundrect.canvas.endscene Crash

  Alt 25. Mai 2021, 17:13
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.
  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 03:04 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