2015-09-02 4 views
1

Недавно я обновился от C++ Builder XE8 до Rad Studio 10 Seattle. Я пытаюсь использовать новый компилятор Clang, но у меня проблема.Недопустимые операнды в двоичном выражении на TGridOptions

Об одном классе пользовательские сетки у меня есть следующие строки кода:

__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?

Edit:

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

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

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

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

+0

[другой вопрос] (http://stackoverflow.com/questions/28263339/) не имеет ничего общего с C + + Builder или свойства. –

+0

@RemyLebeau Право. Поскольку ошибка была одна и та же, я думал, что это может по крайней мере направить меня в правильном направлении. –

ответ

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; 
} 
+0

Использование '__property Options = {default = TGridOptions() << TGridOption :: AlternatingRowBackground << TGridOption :: RowSelect};' дает мне ошибку ''выражение не является интегральным постоянным выражением'' Я что-то упустил? –

+1

Тогда вам придется использовать числовую константу. Если вы посмотрите на различные файлы заголовков VCL/FMX, которые имеют свойства «Set' с значениями по умолчанию, все они используют числовые константы (переведенные компилятором Delphi при создании заголовков). Я обновил свой ответ. –

Смежные вопросы