组件通常有很长的properties列表以及可用的默认值:
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};
// ...
};
将所有这些信息存储在form file中会浪费空间,并将其读回会花费时间,这是不希望的,因为在大多数情况下,默认值很少会更改。
要最大程度地减少表单文件中的数据量,可以为每个属性指定默认值(写入表单文件the form editor skips any properties whose values haven't been changed时)。
请注意,这样做不会设置默认值:
注意:属性值不会自动初始化为默认值。也就是说,默认伪指令仅控制何时将属性值保存到表单文件中,而不控制新创建实例上属性的初始值。
构造函数负责:
__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
的默认值?
答案 0 :(得分: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");
// ...
}
参考文献:
__classid
。您可以使用它来获取基于TObject的类(Delphi样式的类)的元类;