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')

他の質問で読んだことから、自分の<<オペレーターを実装するようなことをする必要があります。ただし、これをどのように行うかは正確にはわかりません。私の理解では、現在のコードはコントロール オプションを操作する標準的な方法です。

Classic Boreland コンパイラではスローされないエラーをスローする新しい Clang コンパイラとの違いは何ですか? <<options プロパティを設定できるようにするために、演算子を実装するにはどうすればよいですか?

編集:

Remy の提案に従って構文を修正しました。

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

ただし、次のエラーが表示されるようになりました。 'expression is not an integral constant expression'

この質問によると、答えはコードを関数内に置くことでした。ただし、ヘッダー ファイルでこのプロパティを宣言しているため、その方法がわかりません。私が見逃しているものは他にありますか?

4

1 に答える 1

1

これは、従来のコンパイラでも新しい CLang コンパイラでも有効な構文ではありません。 Optionsは、TGridOptionsSet<>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++ .HPP ファイルの生成時に Delphi コンパイラが数値定数に変換します)、これは C++ よりも Delphi での処理が簡単です。

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 に答える