Get a sub property of a component in Delphi using RTTI

前提是你 提交于 2019-12-02 09:09:39

问题


I would like to access the following property using RTTI

MyComponent1.Property['variable'].SubProperty

I would like something like that:

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;

Basically I want to access a subproperty of my component and I have only strings, so I cannot use Typ:=Ctx.GetType(MyComponent1.ClassInfo) and then Prop:=Typ.GetProperty('Property['variable'].Subproperty') this is not allowed. Attention in the fact that there is a paramenter for the first property. I guess I have to obtain this first property and then somehow the second property, because I cannot use this property1"."property2
Does anyone know how to do that?


回答1:


Index properties as all other properties (except direct references to object fields) just a shortcut to getXXX and setXXX methods.

Try that way:

  1. Get all indexed properties of Ctx.GetType(MyComponent1.ClassInfo) with GetDeclaredIndexedProperties or GetIndexedProperties

  2. Search desired Property in returned array of TRttiIndexedProperty instances.

  3. Get write method description object from WriteMethod property of TRttiIndexedProperty object found.

  4. Get method parameters description if you need it with GetParameters call.

  5. Call Invoke method of method description object with constructed parameter(s) list to set a property value.

Update

This works only in Delphi versions from XE2 and above.

In previous versions indexed properties can be adopted for RTTI only using things like discussed in this question.



来源:https://stackoverflow.com/questions/16948114/get-a-sub-property-of-a-component-in-delphi-using-rtti

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!