Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1838
Erhaltene Danke: 333

[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
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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 := self.Name;          // wird nicht angezeigt
  //FCaption := inherited Caption;  // wird nicht angezeigt
  FCaption := 'Irgendwas';  // wird angezeigt!
end;

procedure TfrCheckRadioControl.Paint;
begin
  Canvas.TextOut(162, 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:

ausblenden 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(162, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18561
Erhaltene Danke: 1588

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1838
Erhaltene Danke: 333

[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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18561
Erhaltene Danke: 1588

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.02.18 13:16 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1838
Erhaltene Danke: 333

[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
BeitragVerfasst: Do 15.02.18 06:33 
Die .OldCreateOrder Eigenschaft findet sich erst in der TCustomForm Klasse (Forms.pas) wieder:
ausblenden Delphi-Quelltext
1:
TCustomForm <- TScrollingWinControl <- TWinControl ...					

Kann also bei mir garnicht gegeben sein:
ausblenden 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)