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] Eigene Komponente: Canvas im Create noch nil (https://www.delphipraxis.net/195900-%5Bfmx%5D-eigene-komponente-canvas-im-create-noch-nil.html)

Medium 5. Apr 2018 11:24

[FMX] Eigene Komponente: Canvas im Create noch nil
 
Hallo mal wieder. Ich komme jetzt wieder öfter wie es scheint :stupid:

Ich baue noch immer meine eigenen visuellen FMX Komponenten (Ableitungen von TShape), und wollte jetzt in deren Konstruktor ein paar Startwerte für Canvas.Stroke setzen:
Delphi-Quellcode:
constructor TPumpe.Create(AOwner: TComponent);
begin
  inherited;
  Width := 32;
  Height := 32;
  FKeepAspect := true;
  Canvas.Stroke.Join := TStrokeJoin.Round;
  Canvas.Stroke.Thickness := 2;
end;
Leider gibt das direkt eine AV wenn ich versuche die Komponente auf ein Formular zu setzen. Kommentiere ich die letzten beiden Zeilen aus, geht es wunderbar.

Später im Paint() kann ich den Canvas problemlos nutzen. Nur kann ich dort diese Dinge nicht mehr setzen, weil dann ja die später im OI gemachten Änderungen immer wieder übernagelt werden.
Ein OnAfterCreate o.ä. konnte ich leider nicht finden. Wie kann man hier die Werte ändern, die direkt nach aufs Formular ziehen eingestellt sein sollen?

Danke schon mal!

Uwe Raabe 5. Apr 2018 13:16

AW: [FMX] Eigene Komponente: Canvas im Create noch nil
 
Du solltest vielleicht das Stroke von TShape anpassen anstatt das Canvas.Stroke. Im TShape.Painting wird das dann in die Canvas übertragen.

Medium 5. Apr 2018 13:42

AW: [FMX] Eigene Komponente: Canvas im Create noch nil
 
:wall: Jap. Das klingt weit sinnvoller. Danke!

himitsu 5. Apr 2018 13:44

AW: [FMX] Eigene Komponente: Canvas im Create noch nil
 
k.A. wie genau das FMX macht, aber vermutlich ähnlich.

In der VCL haben solche Komponenten (TShape, TPaintBox, TImage, ...) keinen eigenen Canvas, sondern malen auf die Oberfläche ihres Parents.
und der Parent ist im Constructor noch nicht zugewiesen, weswegen es da Probleme geben muß.


Weiß grade nicht was beim "Draufziehen" (neu Erstellen) ist, aber beim Laden der DFM gibt es die
Delphi-Quellcode:
procedure Loaded;
, welche nach Zuweisen aller Eigenschaften aufgerufen wird.
Ansonsten machen sich viele "bösartig" einen "wurdegeladen"-Boolean, welchen sie im OnPaint prüfen und anschließend auf True setzen. (
Delphi-Quellcode:
if not wurdegeladen then machdeninitializationsschrott; wurdegeladen := True;
)

Medium 5. Apr 2018 14:37

AW: [FMX] Eigene Komponente: Canvas im Create noch nil
 
Alles richtig. Uwe hat aber schon genau getroffen. TShape hat nämlich zwar keinen eigenen Canvas, aber sehr wohl einen eigenen Stroke den ich auch im Create beschreiben kann.

Das mit dem "Erstlauf" hatte ich auch überlegt, bringt nur in diesem Fall nur etwas zur Designtime. Zur Runtime würde ich mir damit immer gleich bei Programmstart alle Komponenten auf den Default-Wert setzen, egal was im OI mal eingestellt wurde.

Ich setze jetzt die Werte im Stroke des TShapes direkt, und das klappt (wie erwartet) 1a.

himitsu 5. Apr 2018 18:38

AW: [FMX] Eigene Komponente: Canvas im Create noch nil
 
ABER, wenn du Komponenten ableitest und Default-Werte änderst, dann solltest du auch unbedingt die Property auf
Delphi-Quellcode:
stored false
oder bei denen den "richtigen"/neuen Default-Wert definieren.

Sonst macht das Speichern und Ändern unheimlich Spaß und auch in der DFM werden unnötige Daten gespeichert.

Beispiel: Boolean ändern
* in der DFM steht dann immer dein neuer Default aus dem Constructor
* und du kannst den auch im OI ändern, aber dann stimmt er mit dem ursprünglichen Default überein, wird nicht gespeichert und beim Neuladen der DFM ist es wieder weg (und das aus deinem Constructor ist wieder da, da der nichtgespeicherte gänderte Wert ja auch nicht aus der DFM geladen wird.


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