__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 helfen

    Ich 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 aus

    Alexander 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)->Canvas
    

    Gruß,

    Alexander



  • geil

    das werde ich meinem lehrer erzählen vor der ganzen klasse und ihn bloßstellen :)=


Anmelden zum Antworten