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.