【问题标题】:Get a sub property of a component in Delphi using RTTIDelphi中使用RTTI获取组件的子属性
【发布时间】:2013-06-01 15:16:29
【问题描述】:

我想使用 RTTI 访问以下属性

MyComponent1.Property['variable'].SubProperty

我想要这样的东西:

var
  Ctx: TRttiContext;
  Typ: TRttiType;
  SubTyp: TRttiType;
  Prop: TRttiProperty;
  SubProp: TRttiProperty;
begin
  Ctx:= TRttiContext.Create;
  Typ:= Ctx.GetType(MyComponent1.ClassInfo);
  Prop:= Typ.GetProperty('Property['variable'].Subproperty') //not possible
  Prop.SetValue(MyComponent1.Property['variable'],'500');
end;

基本上我想访问我的组件的子属性并且我只有字符串,所以我不能使用Typ:=Ctx.GetType(MyComponent1.ClassInfo) 然后Prop:=Typ.GetProperty('Property['variable'].Subproperty') 这是不允许的。注意第一个属性有一个参数。我想我必须获得第一个属性,然后以某种方式获得第二个属性,因为我不能使用这个 property1"."property2
有人知道怎么做吗?

【问题讨论】:

  • 您能否详细说明您在这里真正想要实现的目标?我怀疑最终的答案将是递归:)
  • 我的目标是为 SubProperty 设置一个值,例如:MyComponent1.Property['variable'].SubProperty 但是在我的代码中我有很多组件和属性,所以我必须先检查 MyComponent 然后获取属性Property['variable'] 然后不知何故我想更改 SubProperty,但我不能使用 subProp:= Prop.getPropertyTyp.getProperty('Property['variable'].subProperty')
  • 您可以删除 TRttiContext.Create 和 Ctx.Free 行
  • 我也不太明白你的问题。
  • 基本上我想访问我的组件的子属性并且我只有字符串,所以我不能使用 Typ:=Ctx.GetType(MyComponent1.ClassInfo) 然后 Prop:= Typ.GetProperty('Property['variable'].Subproperty') 这是不允许的。注意第一个属性有一个参数。我想我必须获得第一个属性,然后以某种方式获得第二个属性,因为我不能使用这个 property1"."property2

标签: delphi properties components rtti


【解决方案1】:

将属性索引为所有其他属性(直接引用对象字段除外)只是getXXXsetXXX 方法的快捷方式。

试试这个方法:

  1. 使用GetDeclaredIndexedPropertiesGetIndexedProperties获取Ctx.GetType(MyComponent1.ClassInfo)的所有索引属性

  2. 在返回的TRttiIndexedProperty 实例数组中搜索所需的Property

  3. 从找到的TRttiIndexedProperty 对象的WriteMethod 属性中获取写入方法描述对象。

  4. 如果需要,可以通过GetParameters调用获取方法参数描述。

  5. 使用构造的参数列表调用方法描述对象的Invoke方法来设置属性值。

更新

这仅适用于 XE2 及更高版本的 Delphi 版本。

在以前的版本中,RTTI 只能采用this question 中讨论的内容来采用索引属性。

【讨论】:

  • 你能提供一些代码吗?我很困惑如何完成它......
  • 您使用的是哪个版本的 Delphi? RTTI 对索引属性的支持仅在 XE2 之后才存在 ...
  • 我有 Delphi 2010 版
  • 另一件事是我可能误解了你的问题。你的意思是你想通过提供一个描述内部属性访问路径的字符串来访问内部属性值?
  • 是的,我只有字符串,我想访问该属性,但是当一个属性在另一个属性中时出现问题。
猜你喜欢
  • 2012-07-06
  • 2011-11-30
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多