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();
}
Другие вопросы по тегам