TCheckBox.Data 用作 TValue 时类型转换无效
TCheckBox.Data invalid typecast when using as TValue
重现步骤:
-新的 firemonkey-应用程序
-将 TCheckBox 添加到表单
现在用下面的代码创建一个方法:
procedure TForm1.Foo;
var a,b:Integer; lVal:TValue;
begin
lVal:=TValue.From<Integer>(42);
a:=lVal.AsInteger;
checkbox1.Data:=TValue.From<Integer>(42);
b:=checkbox1.Data.AsInteger;
end;
使用 lVal 的转换运行没有问题,checkbox1.data 但是,即使它也是 TValue,在调用 AsInteger
时也会抛出 "EInvalidCast"-错误。使用 checkbox1.data.AsType<Integer>
时出现相同的错误。
我是在滥用 TCheckBox.Data
还是这是某种错误?
TCheckBox.Data
包含boolean
值,具体为复选框勾选状态。这就是当您尝试从中读取 Integer
时出现 EInvalidCast
错误的原因。
之所以看似可以放入 Integer
数据,是因为 TCheckBox.SetData
将忽略无效数据类型并将 Data
设置为 False
。
重现步骤:
-新的 firemonkey-应用程序
-将 TCheckBox 添加到表单
现在用下面的代码创建一个方法:
procedure TForm1.Foo;
var a,b:Integer; lVal:TValue;
begin
lVal:=TValue.From<Integer>(42);
a:=lVal.AsInteger;
checkbox1.Data:=TValue.From<Integer>(42);
b:=checkbox1.Data.AsInteger;
end;
使用 lVal 的转换运行没有问题,checkbox1.data 但是,即使它也是 TValue,在调用 AsInteger
时也会抛出 "EInvalidCast"-错误。使用 checkbox1.data.AsType<Integer>
时出现相同的错误。
我是在滥用 TCheckBox.Data
还是这是某种错误?
TCheckBox.Data
包含boolean
值,具体为复选框勾选状态。这就是当您尝试从中读取 Integer
时出现 EInvalidCast
错误的原因。
之所以看似可以放入 Integer
数据,是因为 TCheckBox.SetData
将忽略无效数据类型并将 Data
设置为 False
。