unit U_CxGridSet;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,cxGridCustomView, cxGridCustomTableView, cxGridTableView,cxCustomData,
  cxGridDBTableView, cxGrid, BtnEdit, StdCtrls, ExtCtrls, ComCtrls, ToolWin,
  cxGridBandedTableView, cxGridDBBandedTableView;

procedure ReadCxGrid(fileName:string;cxgrid:TcxGridDBTableView;filePack:string='公用');
procedure ReadCxBandedGrid(fileName:string;cxgrid:TcxGridDBBandedTableView;filePack:string='公用');
procedure WriteCxGrid(fileName:string;cxgrid:TcxGridDBTableView;filePack:string='公用');
procedure WriteCxBandedGrid(fileName:string;cxgrid:TcxGridDBBandedTableView;filePack:string='公用');
procedure CreateGroupSummarry(tv1:TcxGridDBTableView);
implementation

///////////////////////////////////////////////////////////////
  //函数功能：从文件中读取cxGridCol设置
  //fileName 推荐为窗口的caption名字caption名字
///////////////////////////////////////////////////////////////
procedure ReadCxGrid(fileName:string;cxgrid:TcxGridDBTableView;filePack:string='公用');
var
 mFileName:string;
begin
  mFileName := ExtractFilePath(Application.ExeName)+'Layout\' +filePack+'\'+trim(fileName)+ '.dbg';
  //从布局文件中恢复
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName);
  CreateGroupSummarry(cxgrid);
end;
///////////////////////////////////////////////////////////////
  //函数功能：从文件中读取cxGridCol设置
  //fileName 推荐为窗口的caption名字caption名字
///////////////////////////////////////////////////////////////
procedure ReadCxBandedGrid(fileName:string;cxgrid:TcxGridDBBandedTableView;filePack:string='公用');
var
 mFileName:string;
begin
  mFileName := ExtractFilePath(Application.ExeName)+'Layout\' +filePack+'\'+trim(fileName)+ '.dbg';
  //从布局文件中恢复
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName);
end;
///////////////////////////////////////////////////////////////
  //函数功能：写cxGridCol设置到.dbg文件中
  //默认推荐为窗口的caption名字
///////////////////////////////////////////////////////////////
procedure WriteCxGrid(fileName:string;cxgrid:TcxGridDBTableView;filePack:string='公用');
var
 mFileName:string;
begin
  mFileName := ExtractFilePath(Application.ExeName)+'Layout\' +filePack+'\'+trim(fileName)+ '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
      CreateDir(ExtractFileDir(mFileName));
  //保存为布局文件
  cxgrid.StoreToIniFile(mFileName);

end;
///////////////////////////////////////////////////////////////
  //函数功能：写cxGridCol设置到.dbg文件中
  //默认推荐为窗口的caption名字
///////////////////////////////////////////////////////////////
procedure WriteCxBandedGrid(fileName:string;cxgrid:TcxGridDBBandedTableView;filePack:string='公用');
var
 mFileName:string;
begin
  mFileName := ExtractFilePath(Application.ExeName)+'Layout\' +filePack+'\'+trim(fileName)+ '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
      CreateDir(ExtractFileDir(mFileName));
   //保存为布局文件
  cxgrid.StoreToIniFile(mFileName);
end;
/////////////////////////////////////////////////////
  //函数：创建汇总列
/////////////////////////////////////////////////////
procedure CreateGroupSummarry(tv1:TcxGridDBTableView);
var
  csg : TcxDataSummaryGroup;
  csglink : TcxDataSummaryGroupItemLink;
  csgItem : TcxDataSummaryItem;
  i:integer;
  mFieldName:string;
begin
    ///创建汇总列
    with tv1.DataController.Summary do
    begin
      try
         csg := DataController.Summary.SummaryGroups.Add;   //创建汇总项

         csg.Links.Clear;
         for i:= 0 to tv1.ColumnCount -1 do
         begin
           if not tv1.Columns[i].Visible then continue;
           mFieldName:=tv1.Columns[i].DataBinding.FieldName;

           if tv1.Columns[i].Summary.FooterKind=skSum  then
           begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
             //tv1.Columns[i].Summary.FooterKind := skSum;

             //这个与Group Row上的汇总同时使用时好象只能有一个有效
             //创建行分组行上的汇总项

             csgitem := csg.SummaryItems.Add;
             csgitem.ItemLink := tv1.Columns[i];   //汇总字段1
             csgitem.Position :=spGroup;
             csgitem.Kind := skSum;
             csgItem.Format := trim(tv1.Columns[i].Caption) +'小计=#,0.0';

             tv1.Columns[i].Summary.GroupFooterKind := skSum;
             tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';

           end
           else if tv1.Columns[i].Summary.FooterKind=skCount  then
           begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
             tv1.Columns[i].Summary.FooterKind := skCount;

             tv1.Columns[i].Summary.GroupFooterKind := skCount;

             //tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';
             //这个与Group Row上的汇总同时使用时好象只能有一个有效
             //创建行分组行上的汇总项
             csgitem := csg.SummaryItems.Add;
             csgitem.ItemLink := tv1.Columns[i];   //汇总字段1
             csgitem.Kind := skCount;
             //csgItem.Format := '小计=#,0.0';

           end
           else
           begin
             csglink := csg.Links.Add;
             csglink.ItemLink := tv1.Columns[i];  //分类字段
              //所有不参与汇总的列都有可能用来分组，必须将这些列加入到
              //SummaryGroupItemLink中，没有加入该连接的列用来分组时
              //汇总值不会显示
            end;

          end;
    finally
    end;
  end;

end;

end.
 