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/)
-   -   Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben (https://www.delphipraxis.net/165832-komponente-benuetzt-parentfont-und-soll-font-style-und-font-color-ueberschreiben.html)

irmdaen 18. Jan 2012 11:57


Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Hallo, ich versuche eine von TCustomLabel abgeleitete Komponente zu erstellen, die als Linklabel dienen soll. Das neue Label soll alle Font-Eigenschaften seines Parent (z.B. der TForm, auf der das Label liegt) verwenden, bis auf Font.Style (unterstrichen) und Font.Color (blau).

Was ich versucht habe: Ich setze in der Komponente in der Create-Methode ParentFont := true, aber sobald ich zusätzlich Font.Style und Font.Color setze, wird Font.ParentFont automatisch wieder auf false gesetzt (erkennbar an der falschen Schriftart) :(

Und auf die Schriftart von Parent (der TForm) kann ich von der Komponente aus auch nicht zugreifen, da Parent.Font.Name keine public Eigenschaft ist :(

Das gewünschte Ergebnis erhalte ich nur, indem ich in der Komponente nur ParentFont auf true setze und die Font.Style und Font.Color erst nach Einbau der Komponente in meiner TForm überschreibe :gruebel:

Gibt es keine Möglichkeit, alles in die Komponente selbst zu packen, ohne nachträglich noch Eigenschaften verändern zu müssen :?:

p80286 18. Jan 2012 12:09

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Wenn Du nicht über .Create gehst, dann nicht.

Gruß
K-H

Mavarik 18. Jan 2012 12:13

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Viel einfacher!

Verlager das problem in das Form...

Itteriere über alle Komponenten auf dem Form und setzt die Font Eigenschaften...

So brauchst Du nix ableiten und keine eigene Componente erzeugen!

Mavarik

DeddyH 18. Jan 2012 12:21

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Oder die Paint-Methode überschreiben und dort Canvas.Font entsprechend formatieren.

shmia 18. Jan 2012 13:22

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von irmdaen (Beitrag 1146446)
ich versuche eine von TCustomLabel abgeleitete Komponente zu erstellen, die als Linklabel dienen soll

Gibt's doch schon.

irmdaen 18. Jan 2012 13:42

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1146455)
Oder die Paint-Methode überschreiben und dort Canvas.Font entsprechend formatieren.

Das habe ich schon ausprobiert, funktioniert aber leider nicht: Ich will ja die Schriftart vom Parent, die hole ich mir in Create mit ParentFont := true. Aber die Canvas.Font.Color und Style in der überschriebenen Paint-Methode werden dann ignoriert!

Mavarik 18. Jan 2012 13:55

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von irmdaen (Beitrag 1146473)
Das habe ich schon ausprobiert, funktioniert aber leider nicht: Ich will ja die Schriftart vom Parent, die hole ich mir in Create mit ParentFont := true. Aber die Canvas.Font.Color und Style in der überschriebenen Paint-Methode werden dann ignoriert!

LOL Hast Du mein Posting gelesen?

irmdaen 18. Jan 2012 14:06

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von Mavarik (Beitrag 1146453)
Viel einfacher!

Verlager das problem in das Form...

Itteriere über alle Komponenten auf dem Form und setzt die Font Eigenschaften...

So brauchst Du nix ableiten und keine eigene Componente erzeugen!

Mavarik

Vielen Dank, aber in der Form selbst hatte ich es schon hingekriegt. Aber weil ich das noch öfters brauchen werde, hätte ich es halt gern verallgemeinert gehabt in einer Komponente, einfach sie ins Formular ziehen und fertig ...

irmdaen 18. Jan 2012 14:08

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von p80286 (Beitrag 1146449)
Wenn Du nicht über .Create gehst, dann nicht.

Gruß
K-H

Bitte wie meinst du das? Wenn ich in Create alle Einstellungen mache, passiert folgendes:
In dieser Reihenfolge
ParentFont := true;
Font.Color := clBlue;
Font.Style := [fsUnderline];
ist das Label blau und unterstrichen, hat aber nicht die Schriftart vom Parent.
In dieser Reihenfolge
Font.Color := clBlue;
Font.Style := [fsUnderline];
ParentFont := true;
hat das Label die Schriftart vom Parent, aber ist nicht blau und nicht unterstrichen. :-(

DeddyH 18. Jan 2012 14:14

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Entweder es hat dieselbe Schrift wie der Parent oder eben nicht. Wenn Du zuerst sagst "Ja, hat es" und dann nachträglich die Schrift änderst, ist es ja wieder eine andere als die des Parents. Von daher ist das Verhalten ja nur logisch und richtig.

[edit] Schnell zusammengeschustert und nicht sonderlich schön, tut aber:
Delphi-Quellcode:
type
  TTestLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint; override;
  end;

...

procedure TTestLabel.Paint;
begin
  Canvas.Font.Assign(Font);
  Canvas.Font.Style := Canvas.Font.Style + [fsBold, fsUnderLine];
  Canvas.Brush.Style := bsClear;
  Canvas.Font.Color := clNavy;
  if AutoSize then
    Width := Canvas.TextWidth(Caption);
  Canvas.TextOut(0, 0, Caption);
end;
[/edit]

Mavarik 18. Jan 2012 14:29

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von irmdaen (Beitrag 1146477)
Vielen Dank, aber in der Form selbst hatte ich es schon hingekriegt. Aber weil ich das noch öfters brauchen werde, hätte ich es halt gern verallgemeinert gehabt in einer Komponente, einfach sie ins Formular ziehen und fertig ...

OK Dann sag doch einfach, dass Du es nicht verstanden hast...

Delphi-Quellcode:
procedure TForm42.FormCreate(Sender: TObject);
var
  i : integer;
begin
  For i:= 0 to Self.ComponentCount-1 do
    begin
      if self.Components[i] is TLabel then
        begin
          with TLabel(self.Components[i]) do
            begin
              Font.Color := clBlue;
              // USW...
            end;
        end;
    end;
end;
Mavarik

DeddyH 18. Jan 2012 14:32

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Was hast Du eigentlich gegen Komponenten? Wenn er/sie nur ein oder zwei solcher Labels haben möchte, dann bietet sich eine eigene Komponente doch geradezu an, vor allem, wenn man so etwas in mehreren Projekten braucht (Wiederverwendbarkeit).

Mavarik 18. Jan 2012 14:36

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1146491)
Was hast Du eigentlich gegen Komponenten? Wenn er/sie nur ein oder zwei solcher Labels haben möchte, dann bietet sich eine eigene Komponente doch geradezu an, vor allem, wenn man so etwas in mehreren Projekten braucht (Wiederverwendbarkeit).

Nach lieber ne Vererbung von TForm... Als noch ne Komponente...

Besonders für die, die keine Komponenten installieren können/wollen...

Mavarik

DeddyH 18. Jan 2012 14:38

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Ob das jetzt der bessere Weg ist möchte mal bezweifeln, gerade dann, wenn nur einige wenige Labels die "Link"-Funktionalität haben sollen. Ich kann mir doch nicht für jede denkbare Konstellation eine TForm-Ableitung machen.

Mavarik 18. Jan 2012 14:42

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1146496)
Ob das jetzt der bessere Weg ist möchte mal bezweifeln, gerade dann, wenn nur einige wenige Labels die "Link"-Funktionalität haben sollen. Ich kann mir doch nicht für jede denkbare Konstellation eine TForm-Ableitung machen.

Doch... :stupid:

Ich glaube ich habe in keine Programm auch nur ein einziges TForm...

Das sind alles immer TMyForm's

Mavarik

DeddyH 18. Jan 2012 14:44

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Wenn man immer eine ähnliche Art von Programmen (gerade hinsichtlich der GUI) schreibt, dann mag das auch angehen. Ob man das aber jetzt für andere Anwender verallgemeinern kann...

irmdaen 18. Jan 2012 14:47

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1146481)
Entweder es hat dieselbe Schrift wie der Parent oder eben nicht. Wenn Du zuerst sagst "Ja, hat es" und dann nachträglich die Schrift änderst, ist es ja wieder eine andere als die des Parents. Von daher ist das Verhalten ja nur logisch und richtig.

[edit] Schnell zusammengeschustert und nicht sonderlich schön, tut aber:
Delphi-Quellcode:
type
  TTestLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint; override;
  end;

...

procedure TTestLabel.Paint;
begin
  Canvas.Font.Assign(Font);
  Canvas.Font.Style := Canvas.Font.Style + [fsBold, fsUnderLine];
  Canvas.Brush.Style := bsClear;
  Canvas.Font.Color := clNavy;
  if AutoSize then
    Width := Canvas.TextWidth(Caption);
  Canvas.TextOut(0, 0, Caption);
end;
[/edit]

Herzlichen Dank!! Ich fasse es nicht, aber das ist genau was ich wollte :-D

himitsu 18. Jan 2012 14:47

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Welche Delphi-Version?
Delphi-Referenz durchsuchenTLinkLabel

Im OnPaint ist es vollkommen grauenhaft untergebracht.
Hab ich hier auf Arbeit mit zu kämpfen, weil irgendwann mal irgendwer dachte dort etwas immer wieder neu überschrteiben zu müssen.
Wenn man dann doch mal was anderes braucht, kann man es vergessen.

Vorschlag:
Delphi-Referenz durchsuchenTComponent.Load überschreiben und dort den Style ändern. (vorher wird dabei noch automatisch der ParentFont geladen)
Dazu dann noch die Font-Eigenschaft und ParentFont per "stored False" aus der DFM ausschließen.

Mavarik 18. Jan 2012 14:49

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von himitsu (Beitrag 1146502)
Im OnPaint ist es vollkommen grauenhaft untergebracht.

[OT]Danke[/OT]

:stupid:

DeddyH 18. Jan 2012 14:54

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
IIRC wird Loaded aber nur aufgerufen, wenn die Komponente zur Entwurfszeit angelegt wurde. Macht man das dynamisch zur Laufzeit, isses wieder Essig.

himitsu 18. Jan 2012 14:59

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Man kann ja in das Create am Ende ein
Delphi-Quellcode:
if not Assigned(Owner) or not (csLoading in Owner.ComponentStyle) then Load;
in Oncreate legen, bzw. auch noch beim Ändern des Parent den Font des Parent auslesen und danach Style neu setzen.

irmdaen 18. Jan 2012 15:05

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1146481)
Entweder es hat dieselbe Schrift wie der Parent oder eben nicht. Wenn Du zuerst sagst "Ja, hat es" und dann nachträglich die Schrift änderst, ist es ja wieder eine andere als die des Parents. Von daher ist das Verhalten ja nur logisch und richtig.

[edit] Schnell zusammengeschustert und nicht sonderlich schön, tut aber:
Delphi-Quellcode:
type
  TTestLabel = class(StdCtrls.TLabel)
  protected
    procedure Paint; override;
  end;

...

procedure TTestLabel.Paint;
begin
  Canvas.Font.Assign(Font);
  Canvas.Font.Style := Canvas.Font.Style + [fsBold, fsUnderLine];
  Canvas.Brush.Style := bsClear;
  Canvas.Font.Color := clNavy;
  if AutoSize then
    Width := Canvas.TextWidth(Caption);
  Canvas.TextOut(0, 0, Caption);
end;
[/edit]

Herzlichen Dank!! Ich fasse es nicht, das ist genau was ich mir vorgestellt habe :lol:

DeddyH 18. Jan 2012 15:08

AW: Komponente benützt ParentFont und soll Font.Style und Font.Color überschreiben
 
Zitat:

Zitat von himitsu (Beitrag 1146509)
Man kann ja in das Create am Ende ein
Delphi-Quellcode:
if not Assigned(Owner) or not (csLoading in Owner.ComponentStyle) then Load;
in Oncreate legen, bzw. auch noch beim Ändern des Parent den Font des Parent auslesen und danach Style neu setzen.

[OT] Oder man leitet sich ein Formular ab, weil man einen Link möchte :stupid: [/OT] So, nu isses aber genug, ich klinke mich aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz