⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 summarymultidemomain.pas

📁 DevExpress ExpressQuantumGrid Suite v5.9 Full Source
💻 PAS
字号:
unit SummaryMultiDemoMain;

{$I ..\..\cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, cxGridLevel, cxGridCustomTableView, cxGridTableView,
  cxGridDBTableView, cxControls, cxGridCustomView, cxGrid, cxCustomData,
  ExtCtrls, ActnList, ImgList, Menus, ComCtrls, cxGridCustomPopupMenu,
  cxGridPopupMenu, ToolWin, cxStyles, cxGraphics, cxFilter, cxData, cxEdit,
  DB, cxDBData, cxClasses, cxDataStorage, cxDBLookupComboBox, cxCalendar,
  cxImageComboBox, cxCalc, cxBlobEdit, cxSpinEdit, cxLookAndFeels;

type
  TSummaryMultiDemoMainForm = class(TForm)
    mmMain: TMainMenu;
    miAbout: TMenuItem;
    miFile: TMenuItem;
    miOptions: TMenuItem;
    miExit: TMenuItem;
    miSummaries: TMenuItem;
    sbMain: TStatusBar;
    Grid: TcxGrid;
    tvOrders: TcxGridDBTableView;
    tvOrdersCustomerID: TcxGridDBColumn;
    tvOrdersPurchaseDate: TcxGridDBColumn;
    tvOrdersPaymentType: TcxGridDBColumn;
    tvOrdersPaymentAmount: TcxGridDBColumn;
    tvOrdersDescription: TcxGridDBColumn;
    tvOrdersQuantity: TcxGridDBColumn;
    lbDescription: TLabel;
    miSelectedRecordOnly: TMenuItem;
    miIgnoreNullValues: TMenuItem;
    N1: TMenuItem;
    miGroupFooter: TMenuItem;
    miMultiSelect: TMenuItem;
    miGroupFooterAlwaysShow: TMenuItem;
    miGroupFooterNeverShow: TMenuItem;
    miGroupFooterShowWhenExpand: TMenuItem;
    cxGridPopupMenu1: TcxGridPopupMenu;
    lvOrders: TcxGridLevel;
    tvOrdersProductID: TcxGridDBColumn;
    tvOrdersPurchaseMonth: TcxGridDBColumn;
    miUseOnAfterSummaryEvent: TMenuItem;
    LookAndFeelController: TcxLookAndFeelController;
    procedure miAboutClick(Sender: TObject);
    procedure miExitClick(Sender: TObject);
    procedure miSelectedRecordsOnlyClick(Sender: TObject);
    procedure miIgnoreNullValuesClick(Sender: TObject);
    procedure miMultiSelectClick(Sender: TObject);
    procedure GridFocusedViewChanged(Sender: TcxCustomGrid;
      APrevFocusedView, AFocusedView: TcxCustomGridView);
    procedure miGroupFooterShowClick(Sender: TObject);
    procedure tvOrdersStylesGetGroupStyle(Sender: TcxGridTableView;
      ARecord: TcxCustomGridRecord; ALevel: Integer; out AStyle: TcxStyle);
    procedure FormShow(Sender: TObject);
    procedure tvOrdersDataControllerSummaryAfterSummary(
      ASender: TcxDataSummary);
    procedure miUseOnAfterSummaryEventClick(Sender: TObject);
    procedure tvOrdersDataControllerSummaryDefaultGroupSummaryItemsSummary(
      ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
      var OutArguments: TcxSummaryEventOutArguments);
  public
    { Public declarations }
  end;

var
  SummaryMultiDemoMainForm: TSummaryMultiDemoMainForm;

implementation

{$R *.dfm}

uses
  SummaryMultiDemoData, AboutDemoForm;

procedure TSummaryMultiDemoMainForm.miAboutClick(Sender: TObject);
begin
  ShowAboutDemoForm;
end;

procedure TSummaryMultiDemoMainForm.miExitClick(Sender: TObject);
begin
  Close;
end;

procedure TSummaryMultiDemoMainForm.miSelectedRecordsOnlyClick(
  Sender: TObject);
var
  ASummary: TcxDataSummary;
begin
  with Sender as TMenuItem do
    Checked := not Checked;
  ASummary := Grid.FocusedView.DataController.Summary;
  if (Sender as TMenuItem).Checked then
    ASummary.Options := ASummary.Options + [soSelectedRecords]
  else
    ASummary.Options := ASummary.Options - [soSelectedRecords];
end;

procedure TSummaryMultiDemoMainForm.miIgnoreNullValuesClick(
  Sender: TObject);
var
  ASummary: TcxDataSummary;
begin
  with Sender as TMenuItem do
    Checked := not Checked;
  ASummary := Grid.FocusedView.DataController.Summary;
  if (Sender as TMenuItem).Checked then
    ASummary.Options := ASummary.Options + [soNullIgnore]
  else
    ASummary.Options := ASummary.Options - [soNullIgnore];
end;

procedure TSummaryMultiDemoMainForm.miMultiSelectClick(
  Sender: TObject);
var
  AView: TcxGridDBTableView;
begin
  with Sender as TMenuItem do
    Checked := not Checked;
  AView := TcxGridDBTableView(Grid.FocusedView);
  AView.OptionsSelection.MultiSelect := (Sender as TMenuItem).Checked;
end;

procedure TSummaryMultiDemoMainForm.GridFocusedViewChanged(
  Sender: TcxCustomGrid; APrevFocusedView,
  AFocusedView: TcxCustomGridView);
var
  AView: TcxGridDBTableView;
begin
  AView := TcxGridDBTableView(Grid.FocusedView);
  miSelectedRecordOnly.Checked := soSelectedRecords in
    AView.DataController.Summary.Options;
  miIgnoreNullValues.Checked := soNullIgnore in
    AView.DataController.Summary.Options;
  miMultiSelect.Checked := AView.OptionsSelection.MultiSelect;
  miGroupFooterAlwaysShow.Checked :=
    AView.OptionsView.GroupFooters = gfAlwaysVisible;
  miGroupFooterNeverShow.Checked :=
    AView.OptionsView.GroupFooters = gfInvisible;
  miGroupFooterShowWhenExpand.Checked :=
    AView.OptionsView.GroupFooters = gfVisibleWhenExpanded;
end;

procedure TSummaryMultiDemoMainForm.miGroupFooterShowClick(
  Sender: TObject);
var
  AView: TcxGridDBTableView;
begin
  (Sender as TMenuItem).Checked := True;
  AView := TcxGridDBTableView(Grid.FocusedView);
  AView.OptionsView.GroupFooters :=
    TcxGridGroupFootersMode(Byte((Sender as TMenuItem).Tag));
end;

procedure TSummaryMultiDemoMainForm.tvOrdersStylesGetGroupStyle(
  Sender: TcxGridTableView; ARecord: TcxCustomGridRecord; ALevel: Integer;
  out AStyle: TcxStyle);
begin
  if (ALevel mod 2) = 0 then
    AStyle := SummaryMultiDemoDataDM.stGreyLight
  else
    AStyle := SummaryMultiDemoDataDM.stBlueSky;
end;

procedure TSummaryMultiDemoMainForm.FormShow(Sender: TObject);
begin
 if SummaryMultiDemoDataDM.tblOrders.Active then
 begin
   tvOrders.DataController.Groups.FullCollapse;
   tvOrders.DataController.Groups.ChangeExpanding(0, False, False);
   tvOrders.DataController.GotoFirst;
 end;
 tvOrders.DataController.Summary.BeginUpdate;
 tvOrders.DataController.Summary.DefaultGroupSummaryItems.OnSummary :=
   tvOrdersDataControllerSummaryDefaultGroupSummaryItemsSummary;
 tvOrders.DataController.Summary.EndUpdate;
end;

procedure TSummaryMultiDemoMainForm.miUseOnAfterSummaryEventClick(
  Sender: TObject);
var
  ASummary: TcxDataSummary;
begin
  with Sender as TMenuItem do
    Checked := not Checked;
  ASummary := tvOrders.DataController.Summary;
  ASummary.BeginUpdate;
  try
    if (Sender as TMenuItem).Checked then
      ASummary.OnAfterSummary := tvOrdersDataControllerSummaryAfterSummary
    else
      ASummary.OnAfterSummary := nil;
  finally
    ASummary.EndUpdate;
  end;
end;

procedure TSummaryMultiDemoMainForm.tvOrdersDataControllerSummaryAfterSummary(
  ASender: TcxDataSummary);
var
  AGroups: TcxDataControllerGroups;
  ASummary: TcxDataSummary;
  AGroupSummaryItems: TcxDataGroupSummaryItems;
  AFooterSummaryItems: TcxDataFooterSummaryItems;
  AVarType: Integer;
  AValue: Variant;
  I,J: Integer;

  function GetFooterSummaryValues(AIndex: Integer; AKind: TcxSummaryKind): Variant;
  var
    K: Integer;
    AValue: Variant;
  begin
    if AKind <> skCount then
    begin
      Result :=
        ASummary.GroupSummaryValues[AGroups.ChildDataGroupIndex[-1, 0], AIndex];
      for K := 1 to AGroups.ChildCount[-1] - 1 do
      begin;
        AValue :=
          ASummary.GroupSummaryValues[AGroups.ChildDataGroupIndex[-1, K], AIndex];
        if VarIsNull(Result) and not VarIsNull(AValue) then
        begin
          Result := AValue;
          Continue;
        end;
        if not VarIsNull(AValue) then
          case AKind of
            skMin:
              if Result > AValue then
                Result := AValue;
            skMax:
              if Result < AValue then
                Result := AValue;
            skSum,skAverage:
              Result := Result + AValue;
          end;
      end;
      if (AKind = skAverage) and (AGroups.ChildCount[-1]>0) and
        (not VarIsNull(Result)) then
        Result := Result/(AGroups.ChildCount[-1]);
    end
    else
      Result := AGroups.ChildCount[-1];
  end;

begin
  AGroups := tvOrders.DataController.Groups;
  if AGroups.GroupingItemCount > 0 then
  begin
    ASummary := tvOrders.DataController.Summary;
    AGroupSummaryItems := ASummary.GroupSummaryItems[0];
    AFooterSummaryItems := ASummary.FooterSummaryItems;
    for I := 0 to AFooterSummaryItems.Count - 1 do
    begin
      AVarType := VarType(ASummary.FooterSummaryValues[I]);
      ASummary.FooterSummaryValues[I] := Null;
      for J := 0 to AGroupSummaryItems.Count - 1 do
        if (AFooterSummaryItems[I].ItemLink = AGroupSummaryItems[J].ItemLink) and
          (AGroupSummaryItems[J].Position = spFooter) then
          begin
            AValue := GetFooterSummaryValues(J,AFooterSummaryItems[I].Kind);
            if not VarIsNull(AValue) then
              ASummary.FooterSummaryValues[I] := VarAsType(AValue, AVarType);
          end;
    end;
  end;
end;

procedure TSummaryMultiDemoMainForm.tvOrdersDataControllerSummaryDefaultGroupSummaryItemsSummary(
  ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
  var OutArguments: TcxSummaryEventOutArguments);
var
  AValue: Variant;
  AItem: TcxDataSummaryItem;
begin
  AItem := Arguments.SummaryItem;
  if (AItem.ItemLink = tvOrdersProductID) and
    (AItem.Kind = skCount) and (AItem.Position = spGroup) then
  begin
    AValue := tvOrders.DataController.Values[
      Arguments.RecordIndex, tvOrdersPaymentAmount.Index];
    if not VarIsNull(AValue) then
      if VarAsType(AValue, varInteger) <= 300000 then
       Dec(OutArguments.CountValue);
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -