Неверные операнды в бинарном выражении в 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, который выдает ошибку, а классический Boreland — нет? Как я могу реализовать << оператор, чтобы я мог установить свойство параметров?

Редактировать:

Я исправил свой синтаксис согласно предложению Реми.

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

Однако теперь я получаю следующую ошибку:
'expression is not an integral constant expression'

В соответствии с этот вопрос ответ заключался в том, чтобы поместить код внутри функции. Однако, поскольку я объявляю это свойство в заголовочном файле, я не уверен, как это сделать. Есть что-то еще, что я пропускаю?

1

Решение

Это недопустимый синтаксис ни в классическом компиляторе, ни в новом компиляторе 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 позволяет вам указать фактический набор (который компилятор 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;
}
1

Другие решения