1

我最近从 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 编译器有什么区别导致它抛出经典 Boreland 编译器没有的错误?如何实现<<运算符以允许我设置 options 属性?

编辑:

根据 Remy 的建议,我已经更正了我的语法。

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

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

根据这个问题,答案是将代码放入函数中。但是,由于我在头文件中声明了这个属性,所以我不知道该怎么做。还有什么我想念的吗?

4

1 回答 1

1

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

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

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

__property Options = {default = 0x81};

__property Options = {default = 129};

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

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;
}
于 2015-09-04T03:19:06.750 回答