C ++ Builder XE - 如何实现TFont属性

时间:2012-04-23 13:31:30

标签: properties fonts custom-component c++builder-xe

我正在开发从TCustomControl类派生的自定义组件。我想添加新的基于TFont的属性,可以在设计时编辑,例如在TLabel组件中。基本上我想要的是添加用户选项来更改字体的各种属性(名称,大小,样式,颜色等),而不将这些属性作为单独的属性添加。

我的第一次尝试:

class PACKAGE MyControl : public TCustomControl
{
...
__published:
    __property TFont LegendFont = {read=GetLegendFont,write=SetLegendFont};

protected:
    TFont __fastcall GetLegendFont();
    void __fastcall SetLegendFont(TFont value);
...
}

编译器返回错误“E2459必须使用operator new构造Delphi样式类”。我也不知道我是否应该使用数据类型TFont或TFont *。每次用户更改单个属性时,创建新对象实例似乎效率低下。我希望代码示例如何实现。

1 个答案:

答案 0 :(得分:3)

必须使用TObject运算符在堆上分配从new派生的类。你试图使用TFont而不使用任何指针,这将无法正常工作。您需要像这样实现您的属性:

class PACKAGE MyControl : public TCustomControl
{
...
__published:
    __property TFont* LegendFont = {read=FLegendFont,write=SetLegendFont};

public:
    __fastcall MyControl(TComponent *Owner);
    __fastcall ~MyControl();

protected:
    TFont* FLegendFont;
    void __fastcall SetLegendFont(TFont* value);
    void __fastcall LegendFontChanged(TObject* Sender);
...
}

__fastcall MyControl::MyControl(TComponent *Owner)
    : TCustomControl(Owner)
{
    FLegendFont = new TFont;
    FLegendFont->OnChange = LegendFontChanged;
}

__fastcall MyControl::~MyControl()
{
     delete FLegendFont;
}

void __fastcall MyControl::SetLegendFont(TFont* value)
{
    FLegendFont->Assign(value);
}

void __fastcall MyControl::LegendFontChanged(TObject* Sender);
{
    Invalidate();
}