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 Komponente mit PaintBox zeichnet sich immer neu (https://www.delphipraxis.net/197917-komponente-mit-paintbox-zeichnet-sich-immer-neu.html)

Hobbycoder 18. Sep 2018 18:35

Komponente mit PaintBox zeichnet sich immer neu
 
Hi,

ich entwickele gerade eine Komponente. Diese basiert auf einem TCustomPanel auf dem eine TScrollbox liegt, und in der wiederum eine TPaintbox gezeichnet werden soll.
Ziel ist es die TScrollBox etwas kleiner zu halten, als das Panel ist (es kommt noch etwas Informationen daneben), die TPaintBox aber weit größer sein kann, und dementsprechend mit der Scrollbox alle Bereiche angescrollt werden können.
Die ersten einfachen Zeichnungsfunktionen sind fertig. Gezeichnet wird im TPaintBox.Paint.

Wenn ich nun die Komponente auf der Form ablege, wird die Paintbox ständig neu gezeichnet. Viel mehr mache ich aber noch gar nicht, außer dass ich bei den Properties der Komponente und im Resize ein Invalidate drin habe.

Woran kann das liegen, bzw. wie muss ich es mache, damit die PaintBox.Paint nur aufgerufen wird, wenn auch wirklich neu gezeichnet werden muss.

EWeiss 18. Sep 2018 18:38

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Du musst feststellen welche Komponente das Invalidieren der PaintBox auslöst.
Ich behaupte mal das es von der TScrollbox ausgelöst wird basierend darauf das die TPaintBox innerhalb der ScrollBox größer ist.
Das löst ein Repaint aus.

Setze zur Designtime die TPaintBox in der weite gleich denn TScrollbox und das Repaint sollte behoben sein.
Verändere dann die größe nachträglich im Code selbst, abhängig von der Value der ScrollBox.

gruss

Zacherl 18. Sep 2018 18:45

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Ja, das Problem ist, dass
Delphi-Quellcode:
TPaintBox
von
Delphi-Quellcode:
TGraphicControl
ableitet und somit kein eigenes (dediziertes) Canvas besitzt. Stattdessen wird das Canvas des Parents verwendet. Wenn du Beispielsweise einen
Delphi-Quellcode:
TButton
über eine PaintBox legst und dann mal mit der Maus hoverst, wirst du sehen, dass
Delphi-Quellcode:
OnPaint
ausgelöst wird. Gleiches gillt, wenn du auf das komplette darunterliegende Formular
Delphi-Quellcode:
Invalidate
anwendest.

Solltest du aber recht einfach prüfen können wer Schuld ist, indem du mal einen Breakpoint im
Delphi-Quellcode:
OnPaint
der PaintBox setzt und dir dann den Stacktrace ansiehst (mhh wobei .. kann sein, dass das Dank Message-Queue doch nicht möglich ist).

Hobbycoder 18. Sep 2018 18:57

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Ah, danke für den Tipp. Ich habe meine Denkfehler gefunden. Ich Dummie hab natürlich die Größe der Paintbox im ObPaint der Paintbox berechnet und auch dort gesetzt ;-) Ab da lief fleißig im Kreis ;-)

EWeiss 18. Sep 2018 18:59

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Zitat:

Ich Dummie hab natürlich die größe der Paintbox im ObPaint (OnPaint) der Paintbox berechnet und auch dort gesetzt
So kann's gehen ;)
Da gehören NUR zeichnungsrelevante Dinge hin.

gruss

Hobbycoder 18. Sep 2018 19:10

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Ja, nee, ist eigentlich klar. Aber du kennst das ja: "Mal eben schnell, zum testen..."

EWeiss 18. Sep 2018 19:10

AW: Komponente mit PaintBox zeichnet sich immer neu
 
Zitat:

Zitat von Hobbycoder (Beitrag 1413526)
Ja, nee, ist eigentlich klar. Aber du kennst das ja: "Mal eben schnell, zum testen..."

JO geht ja jetzt und gut ist :)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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