Ich habe kürzlich begonnen, mein RAD Studio 2007-Projekt auf RAD Studio 2009 zu aktualisieren. Eine Sache, die ich bemerkt habe, ist, dass scheinbar einfacher Code plötzlich nicht mehr kompiliert werden kann.
Beispiel-Code:
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 );
Früher ließ sich das alles kompilieren, aber seit 2009 funktioniert es nicht mehr. Betrachtet man die Vererbungskette für 2007 TBitBtn
verwendet, um von TButton
. Daher wurden Ereignisse, die bei jedem Schaltflächensteuerelement erwartet werden (z. B. OnClick), von der TButton
Klasse. Deshalb konnte ich meine TBitBtn
Klasse als TButton
.
2007 Vererbungskette:
- TBitBtn : TButton
2009 Vererbungskette:
- TBitBtn : TCustomButton
- TButton : TCustomButton
Im Jahr 2009 haben beide TButton y TBitButton entstammen TCustomButton Das wäre auch in Ordnung, wenn man die Attribute der Schaltfläche beibehalten würde. Wenn dies der Fall wäre, könnte ich einfach den Code ändern, um mit einer TCustomButton stattdessen. Leider, TCustomButton enthält nicht Dinge wie OnClick . Daher kann ich nicht länger eine TBitBtn wie ein TButton . Beide dieser Klassen haben jetzt ihre eigenen separaten Schaltfläche wie Attribute (d.h. sie haben beide ihre eigenen OnClick-Ereignis deklariert). Ich meine, bieten Sie zumindest eine Schnittstelle oder etwas, wie IButton dass sowohl TButton y TBitBtn Gerät.
Es scheint, dass gerade solche scheinbar unschuldigen Änderungen unnötigen Schaden anrichten können. Dies scheint seltsam und ich frage mich, ob jemand weiß, warum CodeGear (oder ein Framework-Autor für diese Angelegenheit) würde diese Art von Dingen zu tun?
Was noch wichtiger ist: Gibt es angesichts dieses fragmentierten Erbes und elegant Lösung zur Behandlung einer TBitBtn wie ein TButton ?