我正在尝试从 FMX
TStringGrid::OnDrawColumnCell
事件中的布尔列检查布尔值。
回调有以下参数:
void __fastcall TMainForm::SegmentStringGridDrawColumnCell(TObject *Sender, TCanvas * const Canvas, TColumn * const Column,
const TRectF &Bounds, const int Row, const TValue &Value, const TGridDrawStates State)
如果我尝试阅读
Value.AsBoolean
,我会收到以下错误:
[bcc64x 错误] main.cpp(235): 成员函数 'AsBoolean' 的 'this' 参数具有类型 'const System::Rtti::TValue',但函数未标记为 const
如果我尝试声明一个非常量
TValue
并将其分配给 const TValue
:
TValue MyValue;
#ifndef __clang__
MyValue = TValue::_op_Implicit(Value);
#else
MyValue = TValue::From(Value);
#endif
bool myVal = MyValue.AsBoolean();
代码编译并链接,但在运行时出现以下异常:
异常类 EInvalidCast,带有消息“无效的类类型转换”
当我尝试访问
MyValue.AsBoolean()
时发生异常。
如何从
const TValue &Value
获取值?
我发现我需要简化从 const TValue 复制到局部变量的方式,这样我就可以访问内容而不会出现关于 Value is const but function not 的错误。
此代码并没有使 MyValue = Value,而是将其更改为“tkRecord”类型。
TValue MyValue;
#ifndef __clang__
MyValue = TValue::_op_Implicit(Value);
#else
MyValue = TValue::From(Value);
#endif
bool myVal = MyValue.AsBoolean();
我实际上需要做的只是将值复制到我自己的变量中。 然后我可以访问 Kind 并确定 TValue 的类型。
TValue MyValue = Value;
System::Typinfo::TTypeKind Kind = MyValue.Kind;
在我的例子中,我发现 Kind 是“tkString”,一旦我知道了这一点,我就能够进行字符串比较来确定布尔值“True”和“False”。