Как получить значение свойства по умолчанию? - PullRequest
0 голосов
/ 11 апреля 2019

Компоненты часто имеют длинные списки свойств с используемыми значениями по умолчанию:

class PACKAGE TMySpecialComboBox : public TCustomComboBox
{
public:
  __fastcall TMySpecialComboBox(TComponent *Owner);
  // ...

private:
  // ...
  bool fetch_all_;
  bool rename_;
  TColor background1_, background2_, background3_;
  // ...

__published:
  // ...
  __property bool FetchAll = {read = fetch_all_, write = fetch_all_,
                              default = false};
  __property bool Rename = {read = rename_, write = rename_,
                            default = false};
  __property TColor Background1 = {read = background1_, write = background1_,
                                   default = clWindow};
  __property TColor Background2 = {read = background2_, write = background2_,
                                   default = clWindow};
  __property TColor Background3 = {read = background3_, write = background3_,
                                   default = clWindow};
  // ...
};

Хранение всей этой информации в файле формы тратит впустую пространство, а ее чтение занимает время, что нежелательно, учитывая, что в большинстве случаев изменяются только некоторые значения по умолчанию.

Чтобы минимизировать объем данных в файле формы, вы можете указать значение по умолчанию для каждого свойства (при записи в файл формы редактор форм пропускает любые свойства, значения которых не были изменены ).

Обратите внимание, что при этом не устанавливается значение по умолчанию:

Примечание. Значения свойств не инициализируются автоматически по умолчанию. То есть директива по умолчанию управляет только тогда, когда значения свойств сохраняются в файле формы, но не являются начальными значениями свойства во вновь созданном экземпляре.

за это отвечает конструктор:

__fastcall TMySpecialComboBox::TMySpecialComboBox(TComponent* Owner)
  : TCustomComboBox(Owner), // ...
{
  FetchAll = false;       // how to get the default value ?
  Rename = false;         // how to get the default value ?
  Background1 = clWindow  // how to get the default value ?
  // ...
}

но написание инициализации таким образом очень подвержено ошибкам.

Как я могу получить значение по умолчанию __property?

1 Ответ

0 голосов
/ 11 апреля 2019

Это можно сделать через структуру TRttiContext.

#include <Rtti.hpp>

int get_property_default(const String &name)
{
  TRttiContext ctx;

  auto *p(ctx.GetType(__classid(TMySpecialComboBox))->GetProperty(name));
  assert(dynamic_cast<TRttiInstanceProperty *>(p));

  return static_cast<TRttiInstanceProperty *>(p)->Default;
}

__fastcall TMySpecialComboBox::TMySpecialComboBox(TComponent* Owner)
  : TCustomComboBox(Owner), // ...
{
  FetchAll = get_property_default("FetchAll");
  // ...
}

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...