繁体   English   中英

TGridOptions上二进制表达式的无效操作数

[英]Invalid operands to binary expression on TGridOptions

我最近从C ++ Builder XE8升级到Rad Studio 10 Seattle。 我正在尝试使用新的Clang编译器,但遇到了问题。

在自定义网格类上,我具有以下代码行:

__property Options = {default=TGridOption::AlternatingRowBackground << TGridOption::RowSelect};

这会导致编译器出现以下错误:

[CLANG Error] FmGridU.h(57): invalid operands to binary expression ('Fmx::Grid::TGridOption' and 'Fmx::Grid::TGridOption')

根据我在其他问题中所读的内容,我需要做一些实现自己的<<操作符的事情。 但是,我不确定我将如何去做。 据我了解,当前代码是使用控件选项的标准方法。

与新的Clang编译器有什么区别,导致它在Classic Boreland编译器没有的地方引发错误? 如何实现<<操作符以允许我设置options属性?

编辑:

我已按照Remy的建议纠正了语法。

__property Options = {default = TGridOptions() << TGridOption::AlternatingRowBackground << TGridOption::RowSelect};

但是,现在出现以下错误: 'expression is not an integral constant expression'

根据这个问题 ,答案是将代码放入函数中。 但是,由于我在头文件中声明了此属性,因此我不确定如何执行此操作。 还有其他我想念的东西吗?

在经典编译器或新的CLang编译器中,这都是无效的语法。 Options是一个TGridOptions ,它是一个TGridOption值的Set<> (即: typedef System::Set<TGridOption, TGridOption::AlternatingRowBackground, TGridOption::HeaderClick> TGridOptions; )。 您需要构造一个实际的TGridOptions对象,然后才能为其分配任何值,例如:

TGridOptions MyOptions = TGridOptions() << TGridOption::AlternatingRowBackground << TGridOption::RowSelect;

但是,不能在属性声明内创建Set<>对象。 但是,您可以做的是指定一个数字常量,该常量表示Set<>对象的二进制内容。 在这种情况下,对于TGridOptions集, TGridOption::AlternatingRowBackground位于位0,而TGridOption::RowSelect位于位7,因此包含TGridOption::AlternatingRowBackgroundTGridOption::RowSelect的集合的数值为TGridOption::RowSelect启用二进制10000001 ,十六进制0x81 ,十进制129 ,因此可以这样声明属性:

__property Options = {default = 0x81};

__property Options = {default = 129};

在Delphi中,这比在C ++中更容易处理,因为Delphi允许您指定实际的集合(在生成C ++ .HPP文件时,Delphi编译器会将其转换为数字常量):

property Options default [TGridOption.AlternatingRowBackground, TGridOption.RowSelect];

在任何一种情况下,与任何其他属性一样,请确保您确实在网格的构造函数中分配了相同的TGridOptions默认值以匹配属性声明,否则该属性将无法正确地往返于DFM / FMX资源。 在这种情况下,可以使用真实的TGridOptions对象来分配属性值:

__fastcall TMyGrid::TMyGrid(TComponent *AOwner)
    : public TCustomGrid(AOwner)
{
    Options = TGridOptions() << TGridOption::AlternatingRowBackground << TGridOption::RowSelect;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM