在Delphi中动态分配值

Vib*_*nRC 3 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 5

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

SetValue(Button1, TValue.From(TButton.TButtonStyle(2)))
Run Code Online (Sandbox Code Playgroud)

在您的代码中,使用AsOrdinal不正确.这是一个返回a的函数TRttiOrdinalType.但TRttiOrdinalType这样描述:

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

但是你需要提供一个TValue代表a TButtonStyle的代码,这就是上面的代码所实现的代码.


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

SetValue(Button1, TValue.From<TButton.TButtonStyle>(TButton.TButtonStyle(2)));
Run Code Online (Sandbox Code Playgroud)

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

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

QC#103129

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

感谢Serg指出使用类型推断调用参数化方法的替代形式不会违反内部错误.