//--------------------------------------------------------------------------- #include #pragma hdrstop #include "ViewChartDemoMain.h" #include "AboutDemoForm.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "cxClasses" #pragma link "cxControls" #pragma link "cxCustomData" #pragma link "cxData" #pragma link "cxDataStorage" #pragma link "cxDBData" #pragma link "cxEdit" #pragma link "cxFilter" #pragma link "cxGraphics" #pragma link "cxGrid" #pragma link "cxGridChartView" #pragma link "cxGridCustomTableView" #pragma link "cxGridCustomView" #pragma link "cxGridDBChartView" #pragma link "cxGridDBTableView" #pragma link "cxGridLevel" #pragma link "cxGridTableView" #pragma link "cxImageComboBox" #pragma link "cxLookAndFeels" #pragma link "cxStyles" #pragma resource "*.dfm" TfrmMain *frmMain; //--------------------------------------------------------------------------- __fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- TcxGridChartView* TfrmMain::GetActiveChart() { if (dynamic_cast(grMain->ActiveView) == 0) { return NULL; } else { return (TcxGridChartView*)grMain->ActiveView; } } TcxGridChartColumnDiagram* TfrmMain::GetActiveColumnDiagram() { return dynamic_cast(ActiveChart->ActiveDiagram); } void TfrmMain::UpdateControls() { TcxGridChartView* AChart; TcxGridChartColumnDiagram* AColumnDiagram; AChart = ActiveChart; miView->Enabled = AChart != NULL; if (AChart == NULL) return; AColumnDiagram = ActiveColumnDiagram; // view if (AChart->DiagramColumn->Active) miColumnDiagram->Checked = true; else miBarDiagram->Checked = true; miTitlePosition->Items[(int)AChart->Title->Position]->Checked = true; miLegendPosition->Items[(int)AChart->Legend->Position]->Checked = true; miLegendBorder->Checked = AChart->Legend->GetBorder() == lbSingle; // diagram miValueCaptionPosition->Items[(int)AColumnDiagram->Values->CaptionPosition]->Checked = true; // category axis miCategoryAxisVisible->Checked = AColumnDiagram->AxisCategory->Visible; miCategoryAxisGridLines->Checked = AColumnDiagram->AxisCategory->GridLines; miCategoryAxisTickMarkKind->Items[(int)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->Items[(int)AColumnDiagram->AxisValue->TickMarkKind]->Checked = true; miValueAxisTickMarkLabels->Checked = AColumnDiagram->AxisValue->TickMarkLabels; } void TfrmMain::CalculateSalesInfo() { for (int I = 1; I < 5; I++) CalculateSalesInfoForQuarter(I); } void TfrmMain::CalculateSalesInfoForQuarter(int AQuarter) { const Year = 2002; int AStartMonth, AFinishMonth; 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 - 1]); qrSalesByQuarter->Active = true; chvSalesByQuarter->ViewData->ValueCount = qrSalesByQuarter->RecordCount; chvSalesByQuarter->BeginUpdate(); try { int I = 0; qrSalesByQuarter->First(); while (!qrSalesByQuarter->Eof) { chvSalesByQuarter->ViewData->Categories[I] = qrSalesByQuarter->FieldValues["Name"]; chvSalesByQuarter->ViewData->Values[AQuarter - 1][I] = qrSalesByQuarter->FieldValues["Amount"]; qrSalesByQuarter->Next(); I++; } } __finally { chvSalesByQuarter->EndUpdate(); } } TcxGridChartColumnDiagramAxis* TfrmMain::GetActiveAxis(TObject* AMenuItem) { while ((dynamic_cast(AMenuItem) != 0) && (((TMenuItem*)AMenuItem)->Tag == 0)) AMenuItem = ((TMenuItem*)AMenuItem)->Parent; switch (((TMenuItem*)AMenuItem)->Tag) { case 1: return ActiveColumnDiagram->AxisCategory; case 2: return ActiveColumnDiagram->AxisValue; default: return NULL; } } void __fastcall TfrmMain::FormCreate(TObject *Sender) { grMainLevel3->Active = true; CalculateSalesInfo(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::chvSalesByQuarterGetValueHint( TcxGridChartView *Sender, TcxGridChartSeries *ASeries, int AValueIndex, AnsiString &AHint) { AHint = Format("%s sales for Q%d are %s", ARRAYOFCONST((Sender->ViewData->Categories[AValueIndex], ASeries->Index + 1, ASeries->GetValueCaption(AValueIndex)))); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miExitClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miAboutClick(TObject *Sender) { ShowAboutDemoForm(); } //--------------------------------------------------------------------------- // we do not use dxOffice11.FillGradientRect because of the problem in C++Builder during linking void __fastcall FillGradientRectEx(TcxCanvas* ACanvas, const TRect &ARect, TColor AColor1, TColor AColor2, bool AHorizontal) { int AFirstOffset, ALastOffset, APixelSteps, AColorStepsR, AColorStepsG, AColorStepsB; TRect R = ARect; if (AHorizontal) { AFirstOffset = ARect.Left; ALastOffset = ARect.Right - 1; } else { AFirstOffset = ARect.Top; ALastOffset = ARect.Bottom - 1; } APixelSteps = ALastOffset - AFirstOffset; AColorStepsR = GetRValue(AColor2) - GetRValue(AColor1); AColorStepsG = GetGValue(AColor2) - GetGValue(AColor1); AColorStepsB = GetBValue(AColor2) - GetBValue(AColor1); for (int I = AFirstOffset; I <= ALastOffset; I++) { if (AHorizontal) { R.Left = I; R.Right = I + 1; } else { R.Top = I; R.Bottom = I + 1; } ACanvas->Brush->Color = (TColor)RGB( GetRValue(AColor1) + MulDiv(I - AFirstOffset, AColorStepsR, APixelSteps), GetGValue(AColor1) + MulDiv(I - AFirstOffset, AColorStepsG, APixelSteps), GetBValue(AColor1) + MulDiv(I - AFirstOffset, AColorStepsB, APixelSteps)); ACanvas->FillRect(R, NULL, False); } } void __fastcall TfrmMain::chvSalesSeries1CustomDrawValue( TcxGridChartSeries *Sender, TcxCanvas *ACanvas, TcxGridChartDiagramValueViewInfo *AViewInfo, bool &ADone) { FillGradientRectEx(ACanvas, AViewInfo->ContentBounds, clWhite, clBlack, Sender->GridView->DiagramColumn->Active); ADone = true; } //--------------------------------------------------------------------------- void __fastcall TfrmMain::grMainActiveTabChanged(TcxCustomGrid *Sender, TcxGridLevel *ALevel) { UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miColumnDiagramClick(TObject *Sender) { ActiveChart->DiagramColumn->Active = true; } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miBarDiagramClick(TObject *Sender) { ActiveChart->DiagramBar->Active = true; } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miTitlePositionItemClick(TObject *Sender) { ActiveChart->Title->Position = (TcxGridChartPartPosition)((TMenuItem*)Sender)->MenuIndex; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miLegendPositionItemClick(TObject *Sender) { ActiveChart->Legend->Position = (TcxGridChartPartPosition)((TMenuItem*)Sender)->MenuIndex; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miLegendBorderClick(TObject *Sender) { if (!((TMenuItem*)Sender)->Checked) ActiveChart->Legend->Border = lbSingle; else ActiveChart->Legend->Border = lbNone; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miValueCaptionPositionItemClick( TObject *Sender) { ActiveColumnDiagram->Values->CaptionPosition = (TcxGridChartColumnDiagramValueCaptionPosition)((TMenuItem*)Sender)->MenuIndex; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::chvSalesActiveDiagramChanged( TcxGridChartView *Sender, TcxGridChartDiagram *ADiagram) { if (Sender == ActiveChart) UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miAxisVisibleClick(TObject *Sender) { GetActiveAxis(Sender)->Visible = !GetActiveAxis(Sender)->Visible; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miAxisGridLinesClick(TObject *Sender) { GetActiveAxis(Sender)->GridLines = !GetActiveAxis(Sender)->GridLines; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miAxisTickMarkKindItemClick(TObject *Sender) { GetActiveAxis(Sender)->TickMarkKind = (TcxGridChartHistogramTickMarkKind)((TMenuItem*)Sender)->MenuIndex; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miAxisTickMarkLabelsClick(TObject *Sender) { GetActiveAxis(Sender)->TickMarkLabels = !GetActiveAxis(Sender)->TickMarkLabels; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miCategoryAxisCategoriesInReverseOrderClick( TObject *Sender) { TcxGridChartColumnDiagramAxisCategory* AAxis = (TcxGridChartColumnDiagramAxisCategory*)GetActiveAxis(Sender); AAxis->CategoriesInReverseOrder = !AAxis->CategoriesInReverseOrder; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miCategoryAxisValueAxisAtMaxCategoryClick( TObject *Sender) { TcxGridChartColumnDiagramAxisCategory* AAxis = (TcxGridChartColumnDiagramAxisCategory*)GetActiveAxis(Sender); AAxis->ValueAxisAtMaxCategory = !AAxis->ValueAxisAtMaxCategory; UpdateControls(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::miCategoryAxisValueAxisBetweenCategoriesClick( TObject *Sender) { TcxGridChartColumnDiagramAxisCategory* AAxis = (TcxGridChartColumnDiagramAxisCategory*)GetActiveAxis(Sender); AAxis->ValueAxisBetweenCategories = !AAxis->ValueAxisBetweenCategories; UpdateControls(); } //---------------------------------------------------------------------------