Zugriff auf Mehode von übergeordneter Komponente
-
Hallo zusammen!
Ich möchte eine eigene Komponente schreiben, die von TBitBtn (CLX) abgeleitet ist und einige Anpassungen beim Ändern der Breite erfordert. Ich schreibe also folgendes:
Im Header:
class PACKAGE TMyBitBtn : public TBitBtn { private: protected: virtual void __fastcall SetWidth(int Wert); public: __fastcall TMyBitBtn(TComponent* Owner); __published: __property Width = {write = SetWidth}; };Und in der Implementierung:
void __fastcall TMyBitBtn::SetWidth(int Wert) { TBitBtn::SetWidth(Wert); // Führt zu Fehler // Hier kommen die speziellen Anpassungen von MyBitBtn. }Der Compiler gibt bei TBitBtn::SetWidth eine E2247 "Zugriff nicht möglich" aus. Was mache ich falsch?
Gruß
Marc
-
zuerst: in der Hilfe vom BCB ist auch ein Kapitel Komponenten erstellen/ableiten
in deinem Fall würd ich es eher so machen:
void __fastcall TMyBitBtn::SetWidth(int Wert) { FWidth = Wert; }wobei du im Header noch
private: int FWidth;machen solltest
die speziellen Anpassungen gehören nur dann in SetWidth wenn sie den Wert von Width ändern, ansonsten gehört das eher in den Konstructor, OnPaint oder ähnliches
-
Das Kapitel in der Hilfe habe ich natürlich gelesen.
Das Problem: Woher weiss ich denn dass TBitBtn beim Ändern der Breite nichts anderes macht, als FWidth zu setzen? Eventuell passiern da ja noch andere Dinge, weswegen ich sicherheitshalber die Methode aufrufen will.
Die Tatsache, dass es die Methode TBitBtn::SetWidth gibt, deutet ja darauf hin, dass da in der Tat mehr passiert.
Gruß,
Marc
-
Hast Du's schon mal so probiert? Nach einigen Blicken in die Hilfe und die Pascal-Quellen würde ich sagen,
dass SetWidth() nur in TControl definiert ist. Dann müsstest Du natürlich aufpassen, falls Borland die Komponenten-
Hierarchie irgendwann ändert oder SetWidth() irgendwo zwischendrin überschrieben wird.void __fastcall TMyBitBtn::SetWidth(int Wert) { TControl::SetWidth(Wert); }Gruß,
Alexander
-
TControl::SetWidth gibt den gleichen Fehler.
Aber das mit dem Ansehen der Pascal-Quellen ist interessant. Wie kommt man denn da ran?
Gruß
Marc
-
MarcE schrieb:
TControl::SetWidth gibt den gleichen Fehler.
Schade

Ich habe gerade noch mal nachgeschaut. Ist kein Wunder: SetWidth() ist private.MarcE schrieb:
Aber das mit dem Ansehen der Pascal-Quellen ist interessant. Wie kommt man denn da ran?
Indem man die Professional- oder Enterprise-Version kauft. Man kann sogar reindebuggen.
Gruß,
Alexander
-
Hast Du's schon mal mit OnResize versucht? Das Ereignis ist in TControl als protected deklariert,
also solltest Du innerhalb Deiner Komponente darauf zugreifen können.Gruß,
Alexander
-
OnResize tut. Danke.
Die Professional-Version habe ich. Wo finde ich die Pascal-Quellen?
Gruß,
Marc
-
CBuilderPfad\Source