在Delphi中动态分配值

时间:2012-02-03 12:23:14

标签: delphi rtti

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

var

v:TValue ;
 ctx : TRttiContext;
begin

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


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

end;

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

  

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

但是您需要提供代表TValue的{​​{1}},这就是上面代码所实现的目标。


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

TButtonStyle

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

  

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

QC#103129

每当我尝试使用泛型时,我最终会被这些内部错误所击败!

感谢Serg指出调用parameterised method使用类型推断的替代形式不会违反内部错误。