📄 summarymultidemomain.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 + -