__published: __property x auf protcted: __property x ändern
-
hallo zusammen
ich bin mir sicher ich habe hier mal etwas gelesen, finde nur die seite nicht mehr
evtl kann mir jemand von euch helfenIch versuche mich in der Komponentenentwicklung:
ich habe eine klasse
class TMyClass { __published: __property FMyEvent OnMyEvent = {read=Set,write=Get}; }Mein problem:
ich möchte in einer Klasse die von der ersten Klasse erbt den Event im Object-inspector nicht mehr sichtbar haben:
class TMyClass2 : public TMyClass { protected: __property FMyEvent OnMyEvent; }weiss jemand wie man das realisieren muss?
für tipps/links bin ich dankbar
mfg
BigNeal
-
fast richtig, nur die Typdefinition ist zuviel.
class TMyClass2 : public TMyClass { protected: __property OnMyEvent; }PS: Von privat/protected auf public ist allerdings soweit ich weiß nicht möglich...
mfg
xXx
-
merci, aber das habe ich schon getestet..
das klapt ja leider nicht.. irgendwie ist der Event immernoch da..
mfg
BigNeal
-
Dann mach's halt umgekehrt. So macht das Borland auch. In der (vielleicht abstrakten) Superklasse die Eigenschaft protected
machen und nur in den konkreten Subklassen die Eigenschaft published deklarieren.
Oder spricht irgendwas dagegen?Gruß,
Alexander
-
hmmm... wenn ich dich richtig verstehe, müsste das etwa so aussehen
class TCustomMyClass { protected: __property FMyEvent OnMyEvent = {read=Set,write=Get}; } class TMyClass : public TCustomMyClass { __published: __property OnMyEvent; } class TMyClass2 : public TCustomMyClass { protected: __property OnMyEvent; // ist nun überlfüssig, da schon protected }habe ich das jetzt richtig verstanden im Prinzip? wenn ich das so überlege, müsste das klappen

Teste es heute abend sofort ausAlexander Kempf schrieb:
In der (vielleicht abstrakten) Superklasse die Eigenschaft protected
Wie meinst du abstrakten muss man da noch etwas speziell deklarieren?
Wie gesagt, bin noch in den anfängen der Komponentenentwicklung.
aber vielen dank für die hilfe
mfg
BigNeal
-
XXX schrieb:
PS: Von privat/protected auf public ist allerdings soweit ich weiß nicht möglich...
auf public ist nie möglich. immer eine stufe tiefer. hoch geht sowieso nicht
-
BigNeal schrieb:
hmmm... wenn ich dich richtig verstehe, müsste das etwa so aussehen(...)
Genau. Und Du hast natürlich recht, die Wiederholung des protected-Teils kannst Du Dir sparen.
BigNeal schrieb:
Wie meinst du abstrakten muss man da noch etwas speziell deklarieren?
Naja, könnte ja sein, dass Du in der Superklasse sowas drinstehen hast wie:
virtual void foo() = 0;Muss aber nicht sein. Manchmal wird auch in der VCL-Hilfe darauf hingewiesen, dass eine Basisklasse abstrakt ist,
d.h. mindestens eine abstrakte (= rein virtuelle) Methode besitzt, die dann von Subklassen implementiert werden
muss. Wahrscheinlich hast Du keine abstrakte Methoden und kannst diese Bemerkung einfach ignorieren.Übrigens wird auch, wenn Du eine Komponente mit dem Komponentenexperten erstellst, automatisch eine Methode erstellt,
in der eine Instanz Deiner Komponente erstellt wird und die damit sicherstellen soll, dass die Komponente keine
abstrakten Methoden enthält.Gruß,
Alexander
-
dern00b schrieb:
auf public ist nie möglich. immer eine stufe tiefer. hoch geht sowieso nicht
Wer sagt denn sowas?
Es gibt sogar die Möglichkeit mit einer "Cracker"-Klasse protected-Eigenschaften public zu machen.
Wenn Du Zugriff auf die Canvas-Eigenschaft eines Controls brauchst, weißt aber nur, dass es von TCustomControl erbt,
dann kannst Du Dir eine solche Klassendeklaration schreiben:class TCustomControlCracker: public TCustomControl { public: __property Canvas; }und dann an anderer Stelle die Canvas-Eigenschaft so ansprechen:
((TCustomControlCracker*)CustomControl)->CanvasGruß,
Alexander
-
geil
das werde ich meinem lehrer erzählen vor der ganzen klasse und ihn bloßstellen :)=