VCL-Komponente richtig ableiten um auf das Ereignis OnMouseLeave zu erweitern



  • Hallo,
    zur Vererbung von VCL-Komponenten habe ich einige Fragen, die Ihr mir vielleicht beantworten könnt.
    Ich möchte bei einer bestehenden Komponente, sagen wir z.B. TxyImage, die ähnlich BuilderXE3-TImage funktioniert, die fehlenden Events OnMouseEnter und OnMouseLeave zusätzlich einführen. Dies soll durch Ableitung und notwendiger Ergänzung von TxyImage über TxyImageEx geschehen.

    Nachdem, was ich weiß, gelten in einer abgeleiteten Klasse alle Elemente der vorherigen Basis-Klassen, wenn sie dort public bzw. published deklariert wurden. Protected Elemente können durch Überschreiben in der abgeleiteten Klasse sichtbar gemacht werden (private, public, published).

    Frage:
    Welche Variablen, _property(s), Funktionen von welchen Klassen muss ich verwenden, um in der abgeleiteten Klasse TxyImageEx die Eigenschaft OnMouseLeave unter __published zu erhalten?

    Zur Vereinfachung beziehe ich mich im Folgenden nur noch auf OnMouseLeave.
    Hier die Klassenhierarchie von TxyImage und die für OnMouseLeave gefilterten Variablen, __property(s) und und zugehörigen Elementfunktionen zur jeweiligen Klasse gelistet:

    TObject
    |
    TPersistent
    |
    TComponent
    |
    TControl
    private:
      System::Classes::TNotifyEvent FOnMouseLeave;
      MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Message);
    protected:
      __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave};
    |
    TWinControl
    |
    TCustomControl
    |
    TxyControl
    private:
      System::Classes::TNotifyEvent FOnMouseLeave;
      HIDESBASE MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Message);
    protected:
      DYNAMIC void __fastcall MouseLeave(Vcl::Controls::TControl* AControl);
       __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave};
    |
    TxyContainer
    protected:
      DYNAMIC void __fastcall MouseLeave(Vcl::Controls::TControl* AControl);
    |
    TxyCustomEditContainer
    |
    TxyCustomEdit
    protected:
      DYNAMIC void __fastcall MouseLeave(Vcl::Controls::TControl* AControl);
    public:
       __property OnMouseLeave;
    |
    TxyCustomImage
    protected:
      DYNAMIC void __fastcall MouseLeave(Vcl::Controls::TControl* AControl);
    |
    TxyImage 
    |
    TxyImageEx //geplante Ableitung
    __published:
      __property OnMouseLeave; //Ziel
    


  • DYNAMIC void __fastcall MouseLeave(Vcl::Controls::TControl* AControl);

    Musst Du in Deiner abgeleiteten Klasse überschreiben.
    Nicht vergessen die Vorfahrmethode in der abgeleiteten Methode zu rufen, außer Du implementierst das Verhalten komplett neu.


Anmelden zum Antworten