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

时间:2011-05-15 03:36:30

标签: delphi delphi-xe rtti

检查这个简化的示例(真实情况不同),我想设置对象的嵌套属性的值,在这种情况下,将TLabel组件的Font的颜色设置为{{1使用RTTI。

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;

1 个答案:

答案 0 :(得分: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;

您需要从Label获取嵌入字体。 TRttiProperty处理类型而不是实例。您需要致电GetValue()SetValue()来处理该实例。

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