如何使用RTTI设置嵌套属性的值

4

请查看这个简化的示例(实际情况不同),我想设置一个对象的嵌套属性的值,在这种情况下,使用 RTTI 将 TLabel 组件的字体颜色设置为 clRed

var
  p : TRttiProperty;
  p2: TRttiProperty;
  c : TRttiContext;
begin
   c := TRttiContext.Create;
   try
     p := c.GetType(Label1.ClassInfo).GetProperty('Font');
     p2 := c.GetType(p.PropertyType.Handle).GetProperty('Color');
     p2.SetValue(p.PropertyType.AsInstance,clred); //this line is not working
   finally
     c.Free;
   end;
end;

此外,我尝试了一下

p2.SetValue(Label1,clred);
1个回答

4
以下代码将会有效。
var
  p : TRttiProperty;
  p2: TRttiProperty;
  c : TRttiContext;
begin
   c := TRttiContext.Create;
   try
     p := c.GetType(Label1.ClassInfo).GetProperty('Font');
     p2 := c.GetType(p.PropertyType.Handle).GetProperty('Color');
     p2.SetValue(p.GetValue(Label1).AsObject,clred); //this line now works.
   finally
     c.Free;
   end;
end;

您需要从标签中获取嵌入式字体。TRttiProperty处理类型而不是实例。您需要调用GetValue()SetValue()来处理实例。

您原来的代码引用了类型而不是实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接