私は最初の部分の解決策しか得られませんでした。元のソースのColumnCreateの実装がおかしいため、少し注意が必要です。
どういう理由ですか?
ユニットFmx.Bind.Grid
(Win32のパス%programfiles%\Embarcadero\RAD Studio\10.0\source\databinding\components
)とメソッド(500行目から開始)を見てください
function TLinkGridToDataSourceControlManager.CreateColumn(
const ADescription : TCreateColumnDescription; AGrid : TCustomGrid ) : TColumn;
列は、に関連して、ADescription.ColumnStyle
または空の場合に作成されADescription.MemberType
ます。ただし、登録済みのクラスに基づくものではなく、ハードコーディングされています。
T
ColumnStyleNameは、先頭なしでColumnClassから構築されるため(たとえば、Class TStringColumn
=> ColumnStyle ) 、これは奇妙StringColumn
です。
なぜEmbaはColumnStyleに基づいて登録済みのクラスを検索しなかったのですか?
FindClass( 'T' + ADescription.ColumnStyle )
もしそうなら、あなたはあなた自身のColumnClassesを登録することができTMyColumn
、ColumnStyleプロパティをに設定MyColumn
すればすべてがうまくいくでしょう。このColumnClassをパッケージとしてインストールしない限り、PropertyEditorでこのColumnStyleを表示することはできませんでしたが(PropertyEditorもハードコーディングされているため、これは機能しません)、OI内で設定できることを気にします。
柔軟になりましょう
これを修正するには、手作業でいくつかの手順を実行する必要があります
- 新しいパスにコピー
Fmx.Bind.Grid.pas
します(プロジェクトが実行したか、有効なDelphi検索/ライブラリパス)
- 名前を変更します
Fmx.Bind.GridAdv.pas
ここで、このコピーのat行にFmx.Bind.Grid
置き換える必要がありますFmx.Bind.GridAdv
9、10、455行目
内部の柔軟性を得るには、これを置き換えます(500行目から)
function TLinkGridToDataSourceControlManager.CreateColumn(
const ADescription: TCreateColumnDescription; AGrid: TCustomGrid): TColumn;
begin
Result := nil;
if ADescription.ColumnStyle <> '' then
これとともに
function TLinkGridToDataSourceControlManager.CreateColumn(
const ADescription : TCreateColumnDescription; AGrid : TCustomGrid ) : TColumn;
// ** MOD START **
type
TColumnClass = class of TColumn;
var
LColumnClass : TColumnClass;
// ** MOD END **
begin
Result := nil;
if ADescription.ColumnStyle <> '' then
// ** MOD START **
begin
LColumnClass := TColumnClass( FindClass( 'T' + ADescription.ColumnStyle ) );
if LColumnClass <> nil
then
begin
Result := LColumnClass.Create( FCustomGrid );
end else
// ** MOD END **
下のいくつかの行を閉じる必要がありますbegin
// ** MOD START **
end;
// ** MOD END **
if Result = nil then
case ADescription.MemberType of
ファイルを保存します
カスタム列
TNumberColumn
サンプルとして、から派生した単純なものを使用しTStringColumn
ます。カスタム列クラスを登録する必要があることを忘れないでください。
unit FMX.Grid.Columns;
interface
uses
FMX.Grid, FMX.Types, FMX.Menus;
type
TNumberColumn = class( TStringColumn )
protected
function CreateCellControl : TStyledControl; override;
end;
implementation
{ TNumberColumn }
function TNumberColumn.CreateCellControl : TStyledControl;
begin
Result := inherited;
( Result as TTextCell ).TextAlign := TTextAlign.taTrailing;
end;
initialization
RegisterFmxClasses( [TNumberColumn] );
end.
使い方?
通常どおりフォームを作成し、一部の列のグリッドを使用してバインディングを作成します。
パッチを実行するには、使用順序に注意する必要があります。パッチを適用したユニットは、元のユニットの後にある必要があります。
unit Main_ViewU;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Grid,
FMX.Layouts, Data.Bind.GenData, Data.Bind.EngExt, FMX.Bind.DBEngExt,
FMX.Bind.Grid, // <-- original unit
FMX.Bind.GridAdv, // <-- patched unit
FMX.Grid.Columns, // CustomColumns unit
System.Bindings.Outputs, FMX.Bind.Editors,
Data.Bind.Components, Data.Bind.Grid, Data.Bind.ObjectScope;
type
TForm1 = class( TForm )
Grid1 : TGrid;
DataGeneratorAdapter1 : TDataGeneratorAdapter;
AdapterBindSource1 : TAdapterBindSource;
BindingsList1 : TBindingsList;
LinkGridToDataSource1 : TLinkGridToDataSource;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1 : TForm1;
implementation
{$R *.fmx}
end.
最後のステップでは、いくつかの列ColumnStyle
をtoに設定しNumberColumn
、プログラムを実行して、これらの列が正しく配置されていることを確認します。
Fmx.Bind.GridAdv.pasを除く完全なサンプルプロジェクトソース