TFont einer Komponente in einer anderen Komponente
-
Hallo Leute,
ich habe ein Problem mit nem simplen TFont Objekt eines Labels, welches zu einer anderen Komponente gehört.
Ich habe eine eigene Komponente, abgeleitete Klasse, darauf befindet sich ein Label. Den Font des Labels mache ich zu einem __property der darüberliegenden Klasse. Funktioniert soweit auch, ich kann im Objektinspektor über den Font-Dialog die Schrift setzen und dann mit einer Setterfunktion Label->Font->Assign(font) auch zuweisen.
Die Zuweisung eines TFont mit dem Zuweisungsoperator = zur Laufzeit, auf das Font property, funktioniert auch.Aber jetzt kommts:
Ich kann zur Laufzeit nicht auf einzelne Eigenschaften des Fonts zugreifen, also zb Font->Name, da bekomme ich einen EAccessViolation.
Zu Designzeit sind Veränderungen an einzelnen Eigenschaften, zb der Color, wirkungslos.
Ich habe gelesen das man auf die VCL Message "CM_FONTCHANGED" reagieren muss, um das label neu zu zeichnen, bzw den Font neu zu setzen.Aber ich weiß nicht wie man einen Eventhandler dafür implementiert. Weiterhin soll ja das Setzen einzelner Werte des Font zur Laufzeit möglich sein, aber ich weiß nicht wie man die Eigenschaften durchleitet, bzw überhaupt erstmal darauf zugreift.
Ich könnte Hilfe gebrauchen^^
MfG
-
Zeig doch mal den Code deines Font-Properties. Deine Erklärung deutet auf einen Fehler im Getter.
Sobald du den Label-Font setzt, sollte sich automatisch das Label neuzeichnen.
-
Hallo,
int02h schrieb:
..die VCL Message "CM_FONTCHANGED" reagieren muss..
Muss du nicht reagieren, wenn alles richtig abgeleitet und registriert wurde. Da die Eigenschaften und Methoden vererbt werden,
geschieht das sozusagen automatisch.Du hast eine ChildKomponente auf einer Parentkomponente. Wenn der Zeiger auf die Child-Kompo public gespeichert wird, muss nur
richtig gecastet werden, um den Zugriff auf die Member zu ermöglichen.Was ist noch besonders? Die Methode Loaded sagt dir was?
O.K.Wenn bis jetzt kein Tipp dabei war, poste einfach den relevanten Code...
mfg
kpeteredit zu langsam....
-
Hier mal Quellcode, auf das wesentliche beschränkt...
Header:
class PACKAGE TProgressBarExt : public TProgressBar { private: TFont *FTextFont; TLabel *LabelText; public: __fastcall TProgressBarExt(TComponent* Owner); __fastcall ~TProgressBarExt(); __published: __property TFont *Font = {read=FTextFont, write=SetTextFont, stored=true}; __property AnsiString Caption = {read=GetCaption, write=SetCaption}; }; #pragma pack(pop)
Cpp:
__fastcall TProgressBarExt::TProgressBarExt(TComponent* Owner) : TProgressBar(Owner) { FTextFont = new TFont(); LabelText = new TLabel(this); } __fastcall TProgressBarExt::~TProgressBarExt() { delete LabelText; delete FTextFont; } void __fastcall TProgressBarExt::Loaded(void) { TProgressBar::Loaded(); SetTextFont(FTextFont); } void __fastcall TProgressBarExt::SetTextFont(TFont *font) { FTextFont->Assign(font); LabelText->Font->Assign(FTextFont); }
Wie gesagt, ich muss irgendwei auf das Ändern des Font reagieren, bzw auf einzelne Eigenschaften, zur Laufzeit und zur Designzeit.
Die Anzeige auf dem Label geht, nur halt wenn man das Font als ganzs Objekt zuweist.
-
Warum erstellst du denn ein eigenes Font-Objekt und schleifst nicht einfach das Label-Font Property durch?
__property TFont *Font = {read=GetTextFont, write=SetTextFont}; TFont* __fastcall TProgressBarExt::GetTextFont() const { return LabelText->Font; } void __fastcall TProgressBarExt::SetTextFont(TFont *font) { LabelText->Font = font; }
Deine bisherige Getter-Methode arbeitet ja nur auf deinem lokalen Font-Objekt, nicht auf dem des Labels.
-
Gute Frage. Ich habe es jetzt so gemacht, wie du beschrieben hast. Danke schonmal dafür.
Bleibt noch die Frage offen, wie man es hinbekommt, dass das Setzen der einzelnen Font-Eigenschaften wie Color oder Name funktioniert.
Im Objektinspektor ist es wirkungslos, die Farbe einzeln zu ändern, genauso wie ein ProgressBarExt1->Font->Color = clBlue; z.B. ..
-
Nein Sorry! Es klappt jetzt reibungslos
Vielen Dank für die Hilfe.
-
Das Ganze funktioniert nicht unter Windows 7, da bekomme ich trotzdem eine Fehlermeldung (EAccessViolation) bei Zugriff auf ProgressBarExt1->Font->Name.
Die Zuweisung eines ganzen Font-Objekts auf ProgressBarExt1->Font funktioniert.Unter XP gehts ohne Probleme, mit gleichem Source. Hab schon alle binären Dateien des Projekts gelöscht, auch das BPL-File, und komplett neu gebuildet und Komponente installiert/aktualisiert.