What happened to the TBitBtn and TButton inheritance chain?

I recently started updating my RAD Studio 2007 project to RAD Studio 2009. One thing I noticed was when, it would seem, simple code suddenly failed to compile.

Code example:

class CButtonPopupMenu
{
    // Snip

public:
    void Init( TButton* SrcButton )
    {
        SrcButton->OnClick = OnButtonClick;
    }

private:
    void __fastcall OnButtonClick( TObject* Sender )
    {
        // Do some button click stuff
    }
};

// Snip

TButton button = new TButton( this );
TBitBtn bitBtn = new TBitBtn( this );
CButtonPopupMenu popupButton = new CButtonPopupMenu( button );
CButtonPopupMenu popupBitBtn = new CButtonPopupMenu( bitBtn );

All this is used for compilation, but since 2009 it does not work. Looking at the 2007 inheritance chain TBitBtnused to deduce from TButton. Therefore, the events that are expected with any button control (i.e., OnClick) were separated by a class TButton. Therefore, I was able to treat my class TBitBtnas TButton.

2007 Inheritance Chain:

  • TBitBtn: TButton

Inheritance Chain 2009:

  • TBitBtn: TCustomButton
  • TButton: TCustomButton

2009 TButton TBitButton TCustomButton, , , , . , TCustomButton. , TCustomButton , OnClick. TBitBtn TButton. , (.. OnClick). , , - IButton, TButton, TBitBtn.

, , , - , . , , -, CodeGear ( Framework ) ?

, , TBitBtn, TButton?

+3
2

TButton TBitBtn OnClick, TControl . TButton TControl:: OnClick , TBitBtn .

D2009 TCustomButton, TCustom..., . TButton TBitBtn TControl:: OnClick . TControl.

TControl, , :

class TCustomButtonAccess
{
public:
    __property OnClick;
};

class CButtonPopupMenu
{
    // Snip

public:
    void Init( TCustomButton* SrcButton )
    {
        ((TCustomButtonAccess*)SrcButton)->OnClick = OnButtonClick;
    }

private:
    void __fastcall OnButtonClick( TObject* Sender )
    {
        // Do some button click stuff
    }
};

TControl:

class TControlAccess
{
public:
    __property OnClick;
};

class CControlPopupMenu
{
    // Snip

public:
    void Init( TControl* SrcControl )
    {
        ((TControlAccess*)SrcControl)->OnClick = OnControlClick;
    }

private:
    void __fastcall OnControlClick( TObject* Sender )
    {
        // Do some click stuff
    }
};

RTTI , , TSpeedButton, OnClick, :

#include <TypInfo.hpp>

class TControlAccess
{
public:
    __property OnClick;
};

class CControlPopupMenu
{
    // Snip

public:
    void Init( TControl* SrcControl )
    {
        TMethod m;
        m.Code = &OnControlClick;
        m.Data = this;
        SetMethodProp(SrcControl, "OnClick", m);
    }

private:
    void __fastcall OnControlClick( TObject* Sender )
    {
        // Do some click stuff
    }
};

:

#include <TypInfo.hpp>

class CObjectPopupMenu
{
    // Snip

public:
    void Init( TObject* SrcObject )
    {
        TMethod m;
        m.Code = &OnObjectClick;
        m.Data = this;
        SetMethodProp(SrcObject, "OnClick", m);
    }

private:
    void __fastcall OnObjectClick( TObject* Sender )
    {
        // Do some click stuff
    }
};
+6

Delphi, TCustomButton is :

if (SrcButton is TButton) then
  (SrcButton as TButton).OnClick := OnButtonClick
else if (SrcButton is TBitButton)
  (SrcButton as TBitButton).OnClick := OnButtonClick;

++

btw, VCL sometime Actions , .. ?

+1

Source: https://habr.com/ru/post/1709697/


All Articles