MyBaseを試してみる。(グループ化 on FireMonkey)
1.メニューから新規作成->FireMonkey HD アプリケーションを選択します。
各コンポーネントを配置し、オブジェクトインスペクタで次の設定をします。
2.TPanelを配置します。 Panel1.Align := alTop; 3.TStringGridを配置します。 StringGrid.Align := alClient; 4.TEditとTLabelを2つずつ配置します。 Label1.Text := 'カウント数'; Label2.Text := '合計金額'; 5.TClientDataSetを配置します。 6.TDataSourceを配置します。 DataSet := ClientDataSet1; 7.TBindScopeDB1を配置します。 DataSource := DataSource1; 8.TBindingListを配置します。
9.BindDBGridLink1を選択し、オブジェクトインスペクタで次の設定をします。 DataSource := BindScopeDB1; GridControl := StringGrid1;
下図のようにBindingsListを右クリックして、TBindDBGridLinkを追加します。 (バインディングコンポーネントをクリックします)
図のようにBindDBGridLink1の設定をします。(DataSource&GridControl)
10.TBindDBEditLinkを2回追加し、オブジェクトインスペクタで次の設定をします。 DataSource := BindScopeDB1; EditControl := Edit1; DataSource := BindScopeDB1; EditControl := Edit2;
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.DBScope, Data.Bind.DBLinks, Fmx.Bind.DBLinks, FMX.Layouts, FMX.Grid, Data.DB, Datasnap.DBClient, FMX.Edit; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; BindingsList1: TBindingsList; BindScopeDB1: TBindScopeDB; BindDBGridLink1: TBindDBGridLink; BindDBEditLink1: TBindDBEditLink; BindDBEditLink2: TBindDBEditLink; procedure FormCreate(Sender: TObject); private procedure KINDGetText(Sender: TField; var Text: string; DisplayText: Boolean); procedure ITEMGetText(Sender: TField; var Text: string; DisplayText: Boolean); public { public 宣言 } end; var Form1: TForm1; implementation {$R *.fmx} // サンプルデータを追加します。 procedure MakeSample(CDS: TClientDataSet); var F: Boolean; begin F := CDS.Active; if not F then CDS.Open; try // サンプルデータの追加 with CDS do begin Appendrecord(['Delphi', 'ESD','Starter',18000]); Appendrecord(['Delphi', 'ESD','Professional',94000]); Appendrecord(['Delphi', 'ESD','Enterprise',236000]); Appendrecord(['Delphi', 'ESD','Ultimate',356000]); Appendrecord(['Delphi', 'ESD','Architect',416000]); Appendrecord(['RAD Studio', 'ESD','Professional',148000]); Appendrecord(['RAD Studio', 'ESD','Enterprise',336000]); Appendrecord(['RAD Studio', 'ESD','Ultimate',456000]); Appendrecord(['RAD Studio', 'ESD','Architect',516000]); Appendrecord(['Delphi', 'Package','Professional',98000]); Appendrecord(['Delphi', 'Package','Enterprise',240000]); Appendrecord(['Delphi', 'Package','Architect',420000]); Appendrecord(['RAD Studio', 'Package','Professional',152000]); Appendrecord(['RAD Studio', 'Package','Enterprise',340000]); Appendrecord(['RAD Studio', 'Package','Architect',520000]); CheckBrowseMode; end; finally if not F then CDS.Close; end; end; // データベースの作成 procedure CreateDB(CDS: TClientDataSet); var I: Integer; begin // データベースの作成 CDS.Close; CDS.FieldDefs.Add('ITEM',ftWideString,20); CDS.FieldDefs.Add('KIND',ftWideString,20); CDS.FieldDefs.Add('DETAIL',ftWideString,20); CDS.FieldDefs.Add('PRICE',ftCurrency); with CDS.IndexDefs.AddIndexDef do begin Name := 'IDX'; Fields := 'ITEM;KIND'; GroupingLevel := 2; end; CDS.CreateDataSet; CDS.Close; for I := 0 to CDS.FieldDefs.Count - 1 do CDS.FieldDefs[I].CreateField(CDS); // 集合フィールド with TAggregateField.Create(CDS) do begin AlignMent := taRightJustify; FieldKind := fkAggregate; FieldName := 'COUNT'; GroupingLevel := 2; IndexName := 'IDX'; Expression := 'COUNT(PRICE)'; Active := True; DataSet := CDS; end; with TAggregateField.Create(CDS) do begin AlignMent := taRightJustify; FieldKind := fkAggregate; FieldName := 'TOTAL_PRICE'; GroupingLevel := 2; IndexName := 'IDX'; Expression := 'SUM(PRICE)'; Active := True; DataSet := CDS; end; CDS.AggregatesActive := True; // インデックスの設定 CDS.IndexName := 'IDX'; // 表示用にフィールド幅を設定 ※無視された(^-^) CDS.FieldByName('ITEM').DisplayWidth := 10; CDS.FieldByName('KIND').DisplayWidth := 10; CDS.FieldByName('DETAIL').DisplayWidth := 15; CDS.FieldByName('PRICE').DisplayWidth := 8; // グループ化されたフィールドの表示設定 CDS.FieldByName('ITEM').OnGetText := Form1.ITEMGetText; CDS.FieldByName('KIND').OnGetText := Form1.KINDGetText; // CDS.AggregatesActive := True; // DBEditの設定 Form1.BindDBEditLink1.FieldName := 'COUNT'; Form1.BindDBEditLink2.FieldName := 'TOTAL_PRICE'; CDS.Open; // サンプルデータの作成 MakeSample(CDS); end; // ITEM表示用 procedure TForm1.ITEMGetText(Sender: TField; var Text: string; DisplayText: Boolean); begin // 同じITEMの場合、一番最初のみ表示 if (gbFirst in ClientDataSet1.GetGroupState(1)) then Text := Sender.AsString else Text := ''; end; procedure TForm1.KINDGetText(Sender: TField; var Text: string; DisplayText: Boolean); begin // 同じKINDの場合、一番最初のみ表示 if (gbFirst in ClientDataSet1.GetGroupState(2)) then Text := Sender.AsString else Text := ''; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateDB(ClientDataSet1); end; end.
実行します。
StringGrid1のオブジェクトインスペクタでAlternatingRowBackgroundをTrueにするとこんな感じになります。
| 固定リンク