2012-04-23 3 views
0

Я разрабатываю настраиваемый компонент, полученный из класса TCustomControl. Я хотел бы добавить новое свойство TFont, которое можно было бы отредактировать во время разработки, например, в компоненте TLabel. В основном я хочу добавить пользователю возможность изменять различные атрибуты шрифта (имя, размер, стиль, цвет и т. Д.), Не добавляя каждый из этих атрибутов в качестве отдельного свойства.C++ Builder XE - Как реализовать свойство TFont

Моя первая попытка:

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

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

Компилятор возвращает ошибки "Классы стилей E2459 Delphi должны быть построены с использованием оператора нового". Я также не знаю, должен ли я использовать тип данных TFont или TFont *. Мне кажется неэффективным создание нового экземпляра объекта каждый раз, когда пользователь меняет один атрибут. Я был бы признателен за образец кода, как это можно сделать.

ответ

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(); 
} 
Смежные вопросы