TGridOptions

时间:2015-09-02 13:51:28

标签: c++ clang c++builder firemonkey c++builder-10-seattle

我最近从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编译器没有?如何实现<<运算符以允许我设置选项属性?

编辑:

根据雷米的建议,我已经纠正了我的语法。

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

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

根据this question,答案是将代码放在函数中。但是,由于我在头文件中声明了这个属性,我不知道该怎么做。还有其他我想念的东西吗?

1 个答案:

答案 0 :(得分:1)

在经典编译器或新的CLang编译器中,这不是有效的语法。 OptionsTGridOptions,是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允许您指定实际集(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;
}