如何在 C++ FireMonkey TStringGrid::OnDrawColumnCell 事件中访问“const TValue & Value”参数中的布尔值?

问题描述 投票:0回答:1

我正在尝试从 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
获取值?

c++ firemonkey c++builder tvalue
1个回答
0
投票

我发现我需要简化从 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”。

© www.soinside.com 2019 - 2024. All rights reserved.