0

多くの場合、コンポーネントには、使用可能なデフォルト値を持つプロパティの長いリストがあります。

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 ?
  // ...
}

しかし、この方法で初期化を記述すると、非常にエラーが発生しやすくなります。

a のデフォルト値を取得するにはどうすればよい__propertyですか?

4

1 に答える 1

0

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");
  // ...
}

参考文献:

于 2019-04-11T17:24:44.417 に答える