как я могу установить значение вложенного свойства, используя RTTI - PullRequest
4 голосов
/ 15 мая 2011

Проверьте этот упрощенный образец (реальный сценарий другой), я хочу установить значение вложенного свойства объекта, в этом случае установить цвет шрифта для компонента TLabel на clRed, используя RTTI.

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 голосов
/ 15 мая 2011

Будет работать следующий код.

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(), чтобы разобраться с экземпляром.

Ваш исходный код ссылался на тип, а не на экземпляр.

...