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

📄 viewchartdemomain.pas

📁 DevExpress ExpressQuantumGrid Suite v5.9 Full Source
💻 PAS
字号:
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.

⌨️ 快捷键说明

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