C++ Builder XE - Как реализовать свойство TFont
Я разрабатываю пользовательский компонент, производный от класса 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 Классы стиля Delphi должны быть созданы с использованием оператора new". Я также не знаю, должен ли я использовать тип данных TFont или TFont*. Мне кажется неэффективным создавать новый экземпляр объекта каждый раз, когда пользователь меняет один атрибут. Я был бы признателен за пример кода, как это можно сделать.
1 ответ
Классы, полученные из 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();
}