-1

在 BDS XE6 中,我尝试使用 Canvas->FillText 放置文本。我对 const 声明有一些问题,无法克服这个问题。

TRect *Rect = new TRect(0, 0, 100, 30);
Canvas->FillText(*Rect, "Hello", false, 100, TFillTextFlags() << TFillTextFlag::RightToLeft, TTextAlign::Center, TTextAlign::Center);

我得到编译器错误:

[bcc32 Error] MyForm.cpp(109): E2522 Non-const function _fastcall TCanvas::FillText(const TRectF &,const UnicodeString,const bool, const float,const TFillTextFlags,const TTextAlign,const TTextAlign) called for const object
  Full parser context
    LavEsiti.cpp(107): parsing: void _fastcall TMyForm::MyGridDrawColumnCell(TObject *,const TCanvas *,const TColumn *,const TRectF &,const int,const TValue &,const TGridDrawStates)

我想获得一些关于我的错误的信息。提前致谢。

4

2 回答 2

1

TRect *Rect = new TRect(0, 0, 100, 30);

您不需要动态分配TRect,而是使用基于堆栈的实例:

TRect Rect(0, 0, 100, 30);
Canvas->FillText(Rect, ...);

或者,使用Rect()完全没有变量的函数:

Canvas->FillText(Rect(0, 0, 100, 30), ...);

我得到编译器错误:[bcc32 Error] MyForm.cpp(109): E2522 Non-const function _fastcall TCanvas::FillText(const TRectF &,const UnicodeString,const bool, const float,const TFillTextFlags,const TTextAlign,const TTextAlign)调用 const 对象

Delphi(编写了 VCL)没有const类方法的 -ness 概念,就像 C++ 一样。事件的Canvas参数OnDrawColumnCell声明为const(我不知道为什么),但TCanvas::FillText()方法没有声明为const. 这就是你得到Non-const function ... called for const object错误的原因。Delphi 对此没有问题,但 C++ 有。

正如您已经发现的那样,您可以const_cast消除错误,但这更像是一种破解而不是解决方案。事件处理程序不应该从一const开始就声明对象指针,这是对最初编写该事件的人的疏忽。

于 2014-05-15T23:09:50.397 回答
0

通过使用 const_cast 选项调用函数解决的问题:

const_cast<TCanvas*>(Canvas)->FillText(*Rect, "Hello", false, 100, TFillTextFlags() << TFillTextFlag::RightToLeft, TTextAlign::Center, TTextAlign::Center);
于 2014-05-15T08:42:18.583 回答