Delphi中值的动态赋值

3

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

var

v:TValue ;
 ctx : TRttiContext;
begin

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


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

end;

这是我的代码,但我遇到了无效的类型转换错误。

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

1个回答

5
调用SetValue的代码应该像这样:
SetValue(Button1, TValue.From(TButton.TButtonStyle(2)))

在你的代码中,使用AsOrdinal是不正确的。那是一个返回TRttiOrdinalType的函数。但TRttiOrdinalType如此描述的:

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

但你需要提供一个表示TButtonStyleTValue,这就是上面的代码实现的功能。
作为旁注,我最初尝试使用通用的TValue.From<T>()函数,如下所示:
SetValue(Button1, TValue.From<TButton.TButtonStyle>(TButton.TButtonStyle(2)));

但这只导致了以下内部编译器错误:
[DCC Fatal Error] Unit58.pas(38): F2084 Internal Error: URW1147 QC#103129 每次我尝试使用泛型时,都会被这些内部错误打败!
感谢Serg指出使用类型推断调用参数化方法的替代形式不会遇到内部错误。

我猜你在这里误用了泛型;尝试使用SetValue(Button1, TValue.From(TButton.TButtonStyle(2))); - kludg
@Serg 您是正确的,您提供的表单使用类型推断不会导致内部错误。但我在这里没有误用泛型。我使用的语法是完全有效的:http://docwiki.embarcadero.com/RADStudio/en/Declaring_Generics#Parameterized_Methods - David Heffernan
1
@DavidHeffernan 当我尝试使用泛型时,我会尝试每种有意义的语法,而不是查看文档。通常总能有所收获。 :) - kludg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接