我正在创建类似于对象检查器的控件,因此我想将对属性的任何更改分配给相关对象。
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
的函数。但是TRttiOrdinalType
是described thus:TRttiOrdinalType是用于描述所有Delphi序数值类型的类,例如Integer,Byte,Word等。
但是您需要提供一个表示
TValue
的TButtonStyle
,这是上面的代码所实现的。顺便说一句,我最初尝试使用通用的
TValue.From<T>()
函数,如下所示:SetValue(Button1, TValue.From<TButton.TButtonStyle>(TButton.TButtonStyle(2)));
但这只会导致以下内部编译器错误:
[DCC致命错误] Unit58.pas(38):F2084内部错误:URW1147
QC#103129
每次我尝试使用泛型时,最终都会被这些内部错误打败!
感谢Serg指出使用类型推断调用parameterised method的另一种形式,不会犯内部错误。