Componentes.Terceros.DevExp.../official/x.19/ExpressQuantumGrid 5/Demos/CBuilder/ViewChartDemo/ViewChartDemoMain.cpp
2007-09-09 11:27:22 +00:00

332 lines
11 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#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<TcxGridChartView*>(grMain->ActiveView) == 0) {
return NULL;
}
else
{
return (TcxGridChartView*)grMain->ActiveView;
}
}
TcxGridChartColumnDiagram* TfrmMain::GetActiveColumnDiagram()
{
return dynamic_cast<TcxGridChartColumnDiagram*>(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<TMenuItem*>(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();
}
//---------------------------------------------------------------------------