Autor |
Beitrag |
Frühlingsrolle
      
Beiträge: 2162
Erhaltene Danke: 399
[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
|
Verfasst: Di 13.02.18 14:42
Hallo Forum
Problemstellung:
Die Beschriftung ( .Caption) meines Steuerelements (von TCustomControl abgeleitet) soll im Design angezeigt und verändert werden können.
Der gesetzte Wert soll am Anfang dem Komponentennamen mit einer Aufzählung entsprechen: frCheckRadioControl1 usw.
TCustomControl, also der Vorgänger meiner Komponente kennt die .Caption Eigenschaft schon, die ich nur noch überschreiben müsste.
Mit folgendem komme ich aber nicht klar:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| type TfrCheckRadioControl = class(TCustomControl) private FCaption: string; procedure SetCaption(Value: string); protected procedure Paint; override; public constructor Create(AOwner: TComponent); override; published property Caption: string read FCaption write SetCaption; end;
implementation
constructor TfrCheckRadioControl.Create(AOwner: TComponent); begin inherited; Parent := TWinControl(AOwner);
Controlstyle := Controlstyle + [csSetCaption]; FCaption := 'Irgendwas'; end;
procedure TfrCheckRadioControl.Paint; begin Canvas.TextOut(16, 2, FCaption); end;
procedure TfrCheckRadioControl.SetCaption(Value: string); begin FCaption := Value; Invalidate; end; |
Auf die Weise entspricht die Beschriftung jedes Mal 'Irgendwas'.
Damit es wie gewünscht funktioniert, muss ich es so handhaben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private FCaption: string; function GetCaption: string; procedure SetCaption(Value: string); published property Caption: string read GetCaption write SetCaption; end;
implementation
procedure TfrCheckRadioControl.Paint; begin Canvas.TextOut(16, 2, Caption); end;
function TfrCheckRadioControl.GetCaption: string; begin result := inherited Caption; end;
procedure TfrCheckRadioControl.SetCaption(Value: string); begin inherited Caption := Value; Invalidate; end; |
Warum funktioniert es nur so? Wieso nimmt die .Caption Eigenschaft den zugwiesenen Wert im Konstruktor (Code oben) nicht an?
_________________ „Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
|
|
jaenicke
      
Beiträge: 18684
Erhaltene Danke: 1618
W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.02.18 09:57
Weil der im Konstruktor noch nicht existiert. Ich vermute es genügt Loaded zu überschreiben. Darin sollte der Wert schon gesetzt sein.
_________________ Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Für diesen Beitrag haben gedankt: Frühlingsrolle
|
|
Frühlingsrolle 
      
Beiträge: 2162
Erhaltene Danke: 399
[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
|
Verfasst: Mi 14.02.18 10:37
Danke für den Hinweis.
Ich sehe in der Methode Loaded() nichts, was darauf hinweisen würde. In der Klasse TComponent wird ein ComponentState (csLoading) zurückgesetzt, und in TControl wird ein Action-Ereignis oder ähnliches bereitgestellt, sowie die Anchors angepasst.
Es genügt mir zu wissen, dass der Vorgänger-Wert in der .Caption bis dahin nicht gegeben ist.
Das betrifft auch andere Eigenschaften wie, .Color und .Font usw.
Seit Delphi 2006, vielleicht auch schon 2005, kann man deswegen beim TRadioButton und TCheckBox jene Eigenschaften garnicht "richtig" setzen, denn da passiert im Anschluss keine Änderung.
Beim .Font lässt sich die Farbe garnicht ändern, die Schriftart und die Größe wohl. Das betrifft auch andere Komponenten. Vieles hat sich nach Delphi7 irgendwie "verschlechtbessert". Und ich dachte, das liegt am Theming.
_________________ „Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
|
|
jaenicke
      
Beiträge: 18684
Erhaltene Danke: 1618
W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.02.18 13:16
Frühlingsrolle hat folgendes geschrieben : | Beim .Font lässt sich die Farbe garnicht ändern, die Schriftart und die Größe wohl. Das betrifft auch andere Komponenten. Vieles hat sich nach Delphi7 irgendwie "verschlechtbessert". |
Naja, ich finde es schon logisch, dass ein Objekt zuerst erzeugt wird (Konstruktor Create) und dann die DFM-Eigenschaften geladen werden (mit anschließendem Aufruf von Loaded). Ich hätte jetzt gedacht, dass das auch schon früher so war.
Es gibt noch OldCreateOrder, aber das wirkt sich nur auf OnCreate und OnDestroy aus soweit ich weiß.
_________________ Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Für diesen Beitrag haben gedankt: Frühlingsrolle
|
|
Frühlingsrolle 
      
Beiträge: 2162
Erhaltene Danke: 399
[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
|
Verfasst: Do 15.02.18 06:33
Die .OldCreateOrder Eigenschaft findet sich erst in der TCustomForm Klasse ( Forms.pas) wieder:
Delphi-Quelltext 1:
| TCustomForm <- TScrollingWinControl <- TWinControl ... |
Kann also bei mir garnicht gegeben sein:
Delphi-Quelltext 1:
| TfrCheckRadioControl <- TCustomControl <- TWinControl ... |
Macht aber nichts. Die Frage an sich ist bereits beantwortet, und es funktioniert wie es soll.
Hab Dank für die Unterstützung, jaenicke!
Das Thema hat sich erledigt !!!
_________________ „Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
|
|
|