我最近从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'
根据this question的回答,是将代码放入函数中。但是,由于我在头文件中声明了此属性,因此我不确定如何执行此操作。还有其他我想念的东西吗?
最佳答案
在经典编译器或新的CLang编译器中,这都是无效的语法。 Options
是TGridOptions
,它是Set<>
值的TGridOption
(即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::AlternatingRowBackground
和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;
}