3

FireMonkeyのグリッドの同じ列に異なるセルコントロールが必要な場合はどうすればよいですか。セルコントロールは列に属しているように見えますが、一部の行にはチェックボックスが必要で、他の行にはコンボボックスまたは編集コントロールが必要な場合があります(プロパティエディターなど)。

前もって感謝します。

4

4 に答える 4

5

この記事で解決策を見つけることができると思います。

カスタム グリッド セルのサンプル

カスタムセルクラスを作成する必要があります。

于 2012-05-29T19:25:38.480 に答える
2

アルノーは、彼の回答ですでに私の記事にリンクしています。この記事では、グリッド、列、およびセルの基本について説明します。次の手順で起動して実行できます。

  • スタイルを作成し、表示するコントロールを追加します (つまり、TCheckbox、TCombobox、および TEdit)。これらを TLayout 内に追加し、各コントロールの StyleName を覚えやすいものに設定します。
  • セルで ApplyStyle を使用し、FindStyleResource を使用して、StyleNames を使用して上記で追加したコントロールを抽出します。
  • グリッドがセルの SetData メソッドを呼び出すとき、適切なコントロールだけが表示されるように、各コントロールの Visible プロパティを設定する必要があります。渡されたデータからこれを判別できない場合は、セルにイベント ハンドラーを追加してデータを取得します。
  • かなり面倒なキーボード処理を整理する必要があります。メモリが機能する場合は、グリッド/セルからコントロールにキーを渡す必要があります(または、コントロールから移動キーをトラップしてグリッドに渡しますか?正確な詳細を忘れてしまったらごめんなさい)。

申し訳ありませんが、これ以上詳細な回答はできませんが、これを完全にカバーするには、一連のブログ投稿が必要になります。

于 2012-05-29T21:50:19.533 に答える
1

スタイルを使用します - セル データを設定するときにセル スタイルを設定します。その後、onapplystyle イベントを使用して、新しくスタイル設定されたセルで必要な処理を行います。

このようにして、必要なコントロールをスタイルに追加し、onapplystyle を使用して (イベントなどを設定するために) コントロールにアクセスできます。

ヒント - FindStyleResource はあなたの友達です :-)

于 2012-05-29T21:26:04.117 に答える
1

プロパティ エディターも必要で、1 つの列でさまざまなセル タイプをホストする方法を探しました。上記のように、行ごとに異なるスタイルを使用することが解決策になる場合がありますが、Firemonkey グリッドは特定の行に対してセル コントロールを予約しないため、セル コントロールが行に表示されるたびに、実際のスタイルが適用されます。これは、静的プロパティ エディタでは大きな問題ではありませんが、多くの行があり、各行に異なるセル タイプがある実際のグリッドでは、異なる戦略が必要です。そこで、別の解決策を思いつきました。TColumn とセル コントロールの間のセル タイプ プロキシを検討して、各セル プロキシが担当するセル コントロールを予約するようにしました。まず、トップ戦略を担当する新しい TColumn (TvariantColumn) があります。

vColumn := TVariantColumn.Create(Self);
vColumn.Header := 'Variant Column';
vColumn.OnGetCellProxyIndex := GetCellProxyIndex;
Grid1.AddObject(vColumn);

次に、次のようなプロキシを作成します

vColumn.NewCellProxy(TTextProxy); 
vColumn.NewCellProxy(TColorComboProxy);
vColumn.NewCellProxy(TComboColorProxy);

次のように、作成後にプロキシ固有のジョブを処理することもできます

with TProgressProxy(vColumn.NewCellProxy(TProgressProxy)) do //4
begin
  Min := 0;
  Max := 100;
end;

with  TPopUpProxy(vColumn.NewCellProxy(TPopupProxy)) do //5
begin
  Items.Add('Istanbul');
  Items.Add('Paris');
  Items.Add('NewYork');
end; 

私は私のウェブサイトで私の方法をブログし、主題についての詳細を見つけることができる詳細な記事を公開しました.

于 2012-11-21T01:15:20.937 に答える