AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi [FMX] Eigene Komponente: Canvas im Create noch nil
Thema durchsuchen
Ansicht
Themen-Optionen

[FMX] Eigene Komponente: Canvas im Create noch nil

Ein Thema von Medium · begonnen am 5. Apr 2018 · letzter Beitrag vom 5. Apr 2018
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

[FMX] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 12:24
Hallo mal wieder. Ich komme jetzt wieder öfter wie es scheint

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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: [FMX] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 14:16
Du solltest vielleicht das Stroke von TShape anpassen anstatt das Canvas.Stroke. Im TShape.Painting wird das dann in die Canvas übertragen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: [FMX] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 14:42
Jap. Das klingt weit sinnvoller. Danke!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [FMX] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 14:44
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 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. (if not wurdegeladen then machdeninitializationsschrott; wurdegeladen := True; )
$2B or not $2B

Geändert von himitsu ( 5. Apr 2018 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: [FMX] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 15:37
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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] Eigene Komponente: Canvas im Create noch nil

  Alt 5. Apr 2018, 19:38
ABER, wenn du Komponenten ableitest und Default-Werte änderst, dann solltest du auch unbedingt die Property auf 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.
$2B or not $2B

Geändert von himitsu ( 5. Apr 2018 um 19:40 Uhr)
  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 21:43 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