我正在创建类似于对象检查器的控件,因此我想将对属性的任何更改分配给相关对象。

var

v:TValue ;
 ctx : TRttiContext;
begin

  //  k.IsOrdinal := true ;
v := v.FromVariant(2)  ;


ctx.GetType(tButton).GetProperty('Style').SetValue(Button1, v.AsOrdinal);

end;


上面是我的代码,但是我收到了无效的类型转换错误。

是否可以处理任何变量和枚举。(因为非常复杂,所以不需要对象和记录)

最佳答案

对SetValue的调用需要如下所示:

SetValue(Button1, TValue.From(TButton.TButtonStyle(2)))


在您的代码中,AsOrdinal的使用不正确。那是一个返回TRttiOrdinalType的函数。但是TRttiOrdinalTypedescribed thus


  TRttiOrdinalType是用于描述所有Delphi序数值类型的类,例如Integer,Byte,Word等。


但是您需要提供一个表示TValueTButtonStyle,这是上面的代码所实现的。



顺便说一句,我最初尝试使用通用的TValue.From<T>()函数,如下所示:

SetValue(Button1, TValue.From<TButton.TButtonStyle>(TButton.TButtonStyle(2)));


但这只会导致以下内部编译器错误:


  [DCC致命错误] Unit58.pas(38):F2084内部错误:URW1147


QC#103129

每次我尝试使用泛型时,最终都会被这些内部错误打败!

感谢Serg指出使用类型推断调用parameterised method的另一种形式,不会犯内部错误。

10-08 04:59