Я недавно обновил 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'
В соответствии с этот вопрос ответ заключался в том, чтобы поместить код внутри функции. Однако, поскольку я объявляю это свойство в заголовочном файле, я не уверен, как это сделать. Есть что-то еще, что я пропускаю?
Это недопустимый синтаксис ни в классическом компиляторе, ни в новом компиляторе 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;
}