您的方法将更新任何TControl 的Text,即使它实际上并未公开对Text 的访问(在TControl 本身中声明了protected,派生类决定是否提升它根据需要发送至public/__published)。
为了说明这一事实,您必须使用 RTTI 来发现 Text 是否可访问。您也可以使用 RTTI 设置属性值,而无需使用 Accessor 技巧。
例如,旧式 RTTI(通过 <TypInfo.hpp> 标头)仅适用于 __published 属性,没有别的,例如:
#include <TypInfo.hpp>
void change(TControl* object) {
if (IsPublishedProp(object, _D("Text"))
SetStrProp(object, _D("Text"), _D("some text"));
}
或者:
#include <TypInfo.hpp>
void change(TControl* object) {
PPropInfo prop = GetPropInfo(object, _D("Text"), TTypeKinds() << tkUString);
if (prop)
SetStrProp(object, prop, _D("some text"));
}
而新式扩展 RTTI(通过 <Rtti.hpp> 标头)支持字段、方法和属性以及所有受支持的成员可见性,例如:
#include <Rtti.hpp>
typedef Set<TMemberVisibility, mvPrivate, mvPublished> TMemberVisibilitySet;
void change(TControl* object) {
static const TMemberVisibilitySet WantedVisibilities = TMemberVisibilitySet() << mvPublic << mvPublished;
TRttiContext ctx;
TRttiType *type = ctx.GetType(object->ClassType());
TRttiProperty* prop = type->GetProperty(_D("Text"));
if ((prop) && (WantedVisibilities.Contains(prop->Visibility)) && (prop->IsWritable))
prop->SetValue(object, _D("some text"));
}