我正在创建一个类似于对象检查器的控件,所以我想将属性的任何更改分配给相关对象。
var
v:TValue ;
ctx : TRttiContext;
begin
// k.IsOrdinal := true ;
v := v.FromVariant(2) ;
ctx.GetType(tButton).GetProperty('Style').SetValue(Button1, v.AsOrdinal);
end;
以上是我的代码,但我收到无效的类型转换错误。
是否可以处理任何变量和枚举。(不需要对象和记录,因为它非常复杂)
答案 0 :(得分:5)
对SetValue的调用需要如下所示:
SetValue(Button1, TValue.From(TButton.TButtonStyle(2)))
在您的代码中,AsOrdinal
的使用不正确。这是一个返回TRttiOrdinalType
的函数。但TRttiOrdinalType
是described thus:
TRttiOrdinalType是用于描述所有Delphi序数值类型的类,如Integer,Byte,Word等。
但是您需要提供代表TValue
的{{1}},这就是上面代码所实现的目标。
顺便说一句,我最初尝试使用通用的TValue.From<T>()
函数:
TButtonStyle
但这只会导致以下内部编译器错误:
[DCC致命错误] Unit58.pas(38):F2084内部错误:URW1147
每当我尝试使用泛型时,我最终会被这些内部错误所击败!
感谢Serg指出调用parameterised method使用类型推断的替代形式不会违反内部错误。