1
votes

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
Can you elaborate more on what you are really trying to achieve here? I suspect the final answer will be recursion :) - whosrdaddy
My goal is to set a value for the SubProperty, for example: MyComponent1.Property['variable'].SubProperty But in my code I have a lot of components and properties, so I have to check first MyComponent and then get the property Property['variable'] and then somehow I would like to change SubProperty, but I cannot use subProp:= Prop.getProperty or Typ.getProperty('Property['variable'].subProperty') - Felipe
You can remove the TRttiContext.Create and Ctx.Free lines - David Heffernan
I also don't really understand your question. - David Heffernan
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 - Felipe

1 Answers

0
votes

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.