unit ViewChartDemoMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, cxGridChartView, cxGridDBChartView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, DBTables, cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGrid, cxTimeEdit, cxImageComboBox, ImgList, cxLookAndFeels, Menus, StdCtrls; type TfrmMain = class(TForm) tvData: TcxGridDBTableView; grMainLevel1: TcxGridLevel; grMain: TcxGrid; dsOrders: TDataSource; tblOrders: TTable; grMainLevel2: TcxGridLevel; chvSales: TcxGridDBChartView; qrSales: TQuery; dsSales: TDataSource; tblOrdersID: TAutoIncField; tblOrdersCustomerID: TIntegerField; tblOrdersProductID: TIntegerField; tblOrdersPurchaseDate: TDateTimeField; tblOrdersTime: TDateTimeField; tblOrdersPaymentType: TStringField; tblOrdersPaymentAmount: TCurrencyField; tblOrdersDescription: TMemoField; tblOrdersQuantity: TIntegerField; tblProducts: TTable; tblOrdersProductName: TStringField; tblCustomers: TTable; dbMain: TDatabase; tblOrdersCustomer: TStringField; tvDataID: TcxGridDBColumn; tvDataPurchaseDate: TcxGridDBColumn; tvDataPaymentType: TcxGridDBColumn; tvDataPaymentAmount: TcxGridDBColumn; tvDataQuantity: TcxGridDBColumn; tvDataProductName: TcxGridDBColumn; tvDataCompany: TcxGridDBColumn; chvSalesByQuarter: TcxGridChartView; chvSalesByQuarterSeries1: TcxGridChartSeries; chvSalesByQuarterSeries2: TcxGridChartSeries; chvSalesByQuarterSeries3: TcxGridChartSeries; chvSalesByQuarterSeries4: TcxGridChartSeries; grMainLevel3: TcxGridLevel; qrSalesByQuarter: TQuery; chvSalesSeries1: TcxGridDBChartSeries; PaymentTypeImages: TImageList; LookAndFeelController: TcxLookAndFeelController; mmMain: TMainMenu; miFile: TMenuItem; miExit: TMenuItem; miAbout: TMenuItem; cxStyleRepository1: TcxStyleRepository; cxStyle1: TcxStyle; cxStyle2: TcxStyle; cxStyle3: TcxStyle; cxStyle4: TcxStyle; miColumnDiagram: TMenuItem; miBarDiagram: TMenuItem; N1: TMenuItem; miView: TMenuItem; miTitlePosition: TMenuItem; miLegendPosition: TMenuItem; miLegendBorder: TMenuItem; miValueCaptionPosition: TMenuItem; miCategoryAxis: TMenuItem; miCategoryAxisVisible: TMenuItem; miCategoryAxisTickMarkLabels: TMenuItem; miCategoryAxisTickMarkKind: TMenuItem; miCategoryAxisGridLines: TMenuItem; N2: TMenuItem; miTitlePositionDefault: TMenuItem; miTitlePositionNone: TMenuItem; miTitlePositionLeft: TMenuItem; miTitlePositionTop: TMenuItem; miTitlePositionRight: TMenuItem; miTitlePositionBottom: TMenuItem; miLegendPositionDefault: TMenuItem; miLegendPositionNone: TMenuItem; miLegendPositionLeft: TMenuItem; miLegendPositionTop: TMenuItem; miLegendPositionRight: TMenuItem; miLegendPositionBottom: TMenuItem; miValueCaptionPositionNone: TMenuItem; miValueCaptionPositionInsideBase: TMenuItem; miValueCaptionPositionCenter: TMenuItem; miValueCaptionPositionInsideEnd: TMenuItem; miValueCaptionPositionOutsideEnd: TMenuItem; miCategoryAxisTickMarkKindNone: TMenuItem; miCategoryAxisTickMarkKindCross: TMenuItem; miCategoryAxisTickMarkKindInside: TMenuItem; miCategoryAxisTickMarkKindOutside: TMenuItem; miValueAxis: TMenuItem; miValueAxisTickMarkLabels: TMenuItem; miValueAxisTickMarkKind: TMenuItem; miValueAxisTickMarkKindOutside: TMenuItem; miValueAxisTickMarkKindInside: TMenuItem; miValueAxisTickMarkKindCross: TMenuItem; miValueAxisTickMarkKindNone: TMenuItem; miValueAxisGridLines: TMenuItem; miValueAxisVisible: TMenuItem; miCategoryAxisCategoriesInReverseOrder: TMenuItem; miCategoryAxisValueAxisAtMaxCategory: TMenuItem; miCategoryAxisValueAxisBetweenCategories: TMenuItem; N3: TMenuItem; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure chvSalesByQuarterGetValueHint(Sender: TcxGridChartView; ASeries: TcxGridChartSeries; AValueIndex: Integer; var AHint: String); procedure miExitClick(Sender: TObject); procedure miAboutClick(Sender: TObject); procedure chvSalesSeries1CustomDrawValue(Sender: TcxGridChartSeries; ACanvas: TcxCanvas; AViewInfo: TcxGridChartDiagramValueViewInfo; var ADone: Boolean); procedure grMainActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel); procedure miColumnDiagramClick(Sender: TObject); procedure miBarDiagramClick(Sender: TObject); procedure miTitlePositionItemClick(Sender: TObject); procedure miLegendPositionItemClick(Sender: TObject); procedure miLegendBorderClick(Sender: TObject); procedure miValueCaptionPositionItemClick(Sender: TObject); procedure chvSalesActiveDiagramChanged(Sender: TcxGridChartView; ADiagram: TcxGridChartDiagram); procedure miAxisVisibleClick(Sender: TObject); procedure miAxisGridLinesClick(Sender: TObject); procedure miAxisTickMarkKindItemClick(Sender: TObject); procedure miAxisTickMarkLabelsClick(Sender: TObject); procedure miCategoryAxisCategoriesInReverseOrderClick(Sender: TObject); procedure miCategoryAxisValueAxisAtMaxCategoryClick(Sender: TObject); procedure miCategoryAxisValueAxisBetweenCategoriesClick( Sender: TObject); private function GetActiveChart: TcxGridChartView; function GetActiveColumnDiagram: TcxGridChartColumnDiagram; protected procedure UpdateControls; public procedure CalculateSalesInfo; procedure CalculateSalesInfoForQuarter(AQuarter: Integer); function GetActiveAxis(AMenuItem: TObject): TcxGridChartColumnDiagramAxis; property ActiveChart: TcxGridChartView read GetActiveChart; property ActiveColumnDiagram: TcxGridChartColumnDiagram read GetActiveColumnDiagram; end; var frmMain: TfrmMain; implementation uses dxOffice11, AboutDemoForm; {$R *.dfm} function TfrmMain.GetActiveChart: TcxGridChartView; begin if grMain.ActiveView is TcxGridChartView then Result := TcxGridChartView(grMain.ActiveView) else Result := nil; end; function TfrmMain.GetActiveColumnDiagram: TcxGridChartColumnDiagram; begin Result := ActiveChart.ActiveDiagram as TcxGridChartColumnDiagram; end; procedure TfrmMain.UpdateControls; var AChart: TcxGridChartView; AColumnDiagram: TcxGridChartColumnDiagram; begin AChart := ActiveChart; miView.Enabled := AChart <> nil; if AChart = nil then Exit; AColumnDiagram := ActiveColumnDiagram; // view if AChart.DiagramColumn.Active then miColumnDiagram.Checked := True else miBarDiagram.Checked := True; miTitlePosition[Ord(AChart.Title.Position)].Checked := True; miLegendPosition[Ord(AChart.Legend.Position)].Checked := True; miLegendBorder.Checked := AChart.Legend.GetBorder = lbSingle; // diagram miValueCaptionPosition[Ord(AColumnDiagram.Values.CaptionPosition)].Checked := True; // category axis miCategoryAxisVisible.Checked := AColumnDiagram.AxisCategory.Visible; miCategoryAxisGridLines.Checked := AColumnDiagram.AxisCategory.GridLines; miCategoryAxisTickMarkKind[Ord(AColumnDiagram.AxisCategory.TickMarkKind)].Checked := True; miCategoryAxisTickMarkLabels.Checked := AColumnDiagram.AxisCategory.TickMarkLabels; miCategoryAxisCategoriesInReverseOrder.Checked := AColumnDiagram.AxisCategory.CategoriesInReverseOrder; miCategoryAxisValueAxisAtMaxCategory.Checked := AColumnDiagram.AxisCategory.ValueAxisAtMaxCategory; miCategoryAxisValueAxisBetweenCategories.Checked := AColumnDiagram.AxisCategory.ValueAxisBetweenCategories; // value axis miValueAxisVisible.Checked := AColumnDiagram.AxisValue.Visible; miValueAxisGridLines.Checked := AColumnDiagram.AxisValue.GridLines; miValueAxisTickMarkKind[Ord(AColumnDiagram.AxisValue.TickMarkKind)].Checked := True; miValueAxisTickMarkLabels.Checked := AColumnDiagram.AxisValue.TickMarkLabels; end; procedure TfrmMain.CalculateSalesInfo; var I: Integer; begin for I := 1 to 4 do CalculateSalesInfoForQuarter(I); end; procedure TfrmMain.CalculateSalesInfoForQuarter(AQuarter: Integer); const Year = 2002; var AStartMonth, AFinishMonth, I: Integer; begin AStartMonth := (AQuarter - 1) * 3 + 1; AFinishMonth := AQuarter * 3; qrSalesByQuarter.Active := False; qrSalesByQuarter.ParamByName('StartDate').AsDateTime := EncodeDate(Year, AStartMonth, 1); qrSalesByQuarter.ParamByName('FinishDate').AsDateTime := EncodeDate(Year, AFinishMonth, MonthDays[IsLeapYear(Year), AFinishMonth]); qrSalesByQuarter.Active := True; chvSalesByQuarter.ViewData.ValueCount := qrSalesByQuarter.RecordCount; chvSalesByQuarter.BeginUpdate; try I := 0; qrSalesByQuarter.First; while not qrSalesByQuarter.Eof do begin chvSalesByQuarter.ViewData.Categories[I] := qrSalesByQuarter.FieldValues['Name']; chvSalesByQuarter.ViewData.Values[AQuarter - 1, I] := qrSalesByQuarter.FieldValues['Amount']; qrSalesByQuarter.Next; Inc(I); end; finally chvSalesByQuarter.EndUpdate; end; end; function TfrmMain.GetActiveAxis(AMenuItem: TObject): TcxGridChartColumnDiagramAxis; begin while (AMenuItem is TMenuItem) and (TMenuItem(AMenuItem).Tag = 0) do AMenuItem := TMenuItem(AMenuItem).Parent; case ((AMenuItem as TMenuItem).Tag) of 1: Result := ActiveColumnDiagram.AxisCategory; 2: Result := ActiveColumnDiagram.AxisValue; else Result := nil; end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin grMainLevel3.Active := True; CalculateSalesInfo; end; procedure TfrmMain.chvSalesByQuarterGetValueHint(Sender: TcxGridChartView; ASeries: TcxGridChartSeries; AValueIndex: Integer; var AHint: String); begin AHint := Format('%s sales for Q%d are %s', [Sender.ViewData.Categories[AValueIndex], ASeries.Index + 1, ASeries.GetValueCaption(AValueIndex)]); end; procedure TfrmMain.miExitClick(Sender: TObject); begin Close; end; procedure TfrmMain.miAboutClick(Sender: TObject); begin ShowAboutDemoForm; end; procedure TfrmMain.chvSalesSeries1CustomDrawValue( Sender: TcxGridChartSeries; ACanvas: TcxCanvas; AViewInfo: TcxGridChartDiagramValueViewInfo; var ADone: Boolean); begin FillGradientRect(ACanvas.Handle, AViewInfo.ContentBounds, clWhite, clBlack, Sender.GridView.DiagramColumn.Active); ADone := True; end; procedure TfrmMain.grMainActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel); begin UpdateControls; end; procedure TfrmMain.miColumnDiagramClick(Sender: TObject); begin ActiveChart.DiagramColumn.Active := True; end; procedure TfrmMain.miBarDiagramClick(Sender: TObject); begin ActiveChart.DiagramBar.Active := True; end; procedure TfrmMain.miTitlePositionItemClick(Sender: TObject); begin ActiveChart.Title.Position := TcxGridChartPartPosition(TMenuItem(Sender).MenuIndex); UpdateControls; end; procedure TfrmMain.miLegendPositionItemClick(Sender: TObject); begin ActiveChart.Legend.Position := TcxGridChartPartPosition(TMenuItem(Sender).MenuIndex); UpdateControls; end; procedure TfrmMain.miLegendBorderClick(Sender: TObject); begin if not TMenuItem(Sender).Checked then ActiveChart.Legend.Border := lbSingle else ActiveChart.Legend.Border := lbNone; UpdateControls; end; procedure TfrmMain.miValueCaptionPositionItemClick(Sender: TObject); begin ActiveColumnDiagram.Values.CaptionPosition := TcxGridChartColumnDiagramValueCaptionPosition(TMenuItem(Sender).MenuIndex); UpdateControls; end; procedure TfrmMain.chvSalesActiveDiagramChanged(Sender: TcxGridChartView; ADiagram: TcxGridChartDiagram); begin if Sender = ActiveChart then UpdateControls; end; procedure TfrmMain.miAxisVisibleClick(Sender: TObject); begin with GetActiveAxis(Sender) do Visible := not Visible; UpdateControls; end; procedure TfrmMain.miAxisGridLinesClick(Sender: TObject); begin with GetActiveAxis(Sender) do GridLines := not GridLines; UpdateControls; end; procedure TfrmMain.miAxisTickMarkKindItemClick(Sender: TObject); begin GetActiveAxis(Sender).TickMarkKind := TcxGridChartHistogramTickMarkKind(TMenuItem(Sender).MenuIndex); UpdateControls; end; procedure TfrmMain.miAxisTickMarkLabelsClick(Sender: TObject); begin with GetActiveAxis(Sender) do TickMarkLabels := not TickMarkLabels; UpdateControls; end; procedure TfrmMain.miCategoryAxisCategoriesInReverseOrderClick( Sender: TObject); begin with GetActiveAxis(Sender) as TcxGridChartColumnDiagramAxisCategory do CategoriesInReverseOrder := not CategoriesInReverseOrder; UpdateControls; end; procedure TfrmMain.miCategoryAxisValueAxisAtMaxCategoryClick( Sender: TObject); begin with GetActiveAxis(Sender) as TcxGridChartColumnDiagramAxisCategory do ValueAxisAtMaxCategory := not ValueAxisAtMaxCategory; UpdateControls; end; procedure TfrmMain.miCategoryAxisValueAxisBetweenCategoriesClick( Sender: TObject); begin with GetActiveAxis(Sender) as TcxGridChartColumnDiagramAxisCategory do ValueAxisBetweenCategories := not ValueAxisBetweenCategories; UpdateControls; end; end.