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

372 lines
14 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#include <shellapi.hpp>
#pragma hdrstop
#include "GridModeDemoMain.h"
#include "GridModeDemoData.h"
#include "AboutDemoForm.h"
#include "GridModeDemoTerminate.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cxClasses"
#pragma link "cxControls"
#pragma link "cxCustomData"
#pragma link "cxData"
#pragma link "cxDBData"
#pragma link "cxEdit"
#pragma link "cxFilter"
#pragma link "cxGraphics"
#pragma link "cxGrid"
#pragma link "cxGridCustomTableView"
#pragma link "cxGridCustomView"
#pragma link "cxGridDBTableView"
#pragma link "cxGridLevel"
#pragma link "cxGridTableView"
#pragma link "cxStyles"
#pragma link "cxButtons"
#pragma link "cxLookAndFeelPainters"
#pragma link "cxLookAndFeels"
#pragma resource "*.dfm"
TGridModeDemoMainForm *GridModeDemoMainForm;
//---------------------------------------------------------------------------
__fastcall TGridModeDemoMainForm::TGridModeDemoMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miAboutClick(TObject *Sender)
{
ShowAboutDemoForm();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::FormCreate(TObject *Sender)
{
try{
GridModeDemoTerminateForm = new TGridModeDemoTerminateForm(this);
GridModeDemoTerminateForm->lbDesc->Caption = strLoadData;
GridModeDemoTerminateForm->Show();
Application->ProcessMessages();
GridModeDemoDataDM->CopyDBToLocalPlace(false);
GridModeDemoDataDM->OpenTables(true);
InitPopulateButton();
}
__finally{
GridModeDemoTerminateForm->Close();
}
}
//---------------------------------------------------------------------------
void TGridModeDemoMainForm::EnableSummaries(bool AEnable, TcxGridDBTableView *AView)
{
TcxAfterSummaryEvent AAfterSummaryEvent = NULL;
if (AEnable)
AAfterSummaryEvent = tvOrdersDataControllerSummaryAfterSummary;
try{
AView->BeginUpdate();
AView->DataController->Summary->OnAfterSummary =
AAfterSummaryEvent;
AView->OptionsView->Footer = AEnable;
}
__finally{
AView->EndUpdate();
}
if (AView->IsMaster)
AView->DataController->ClearDetails();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miCalculateSummariesClick(TObject *Sender)
{
((TMenuItem*)Sender)->Checked = !((TMenuItem*)Sender)->Checked;
EnableSummaries(((TMenuItem*)Sender)->Checked, tvOrders);
EnableSummaries(((TMenuItem*)Sender)->Checked, tvCars);
if (((TMenuItem*)Sender)->Checked){
tvCars->DataController->Summary->BeginUpdate();
tvCars->DataController->Summary->EndUpdate();
}
}
//---------------------------------------------------------------------------
void TGridModeDemoMainForm::EnableSorting(TcxGridDBTableView *AView, bool AEnable)
{
AView->DataController->ClearSorting(false);
TNotifyEvent ASortingChangedEvent = NULL;
if (AEnable)
ASortingChangedEvent = tvDataControllerSortingChanged;
AView->DataController->OnSortingChanged =
ASortingChangedEvent;
AView->OptionsCustomize->ColumnSorting = AEnable;
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miEnableSortingClick(TObject *Sender)
{
((TMenuItem*)Sender)->Checked = !((TMenuItem*)Sender)->Checked;
EnableSorting(tvOrders, ((TMenuItem*)Sender)->Checked);
EnableSorting(tvCars, ((TMenuItem*)Sender)->Checked);
tvCars->DataController->ClearDetails();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miEnableFilteringClick(TObject *Sender)
{
((TMenuItem*)Sender)->Checked = !((TMenuItem*)Sender)->Checked;
if (!tvOrders->DataController->Filter->IsEmpty())
tvOrders->DataController->Filter->Clear();
if (!tvCars->DataController->Filter->IsEmpty())
tvCars->DataController->Filter->Clear();
tvOrders->OptionsCustomize->ColumnFiltering = ((TMenuItem*)Sender)->Checked;
tvCars->OptionsCustomize->ColumnFiltering = ((TMenuItem*)Sender)->Checked;
tvCars->DataController->ClearDetails();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::tvDataControllerFilterGetValueList(
TcxFilterCriteria *Sender, int AItemIndex,
TcxDataFilterValueList *AValueList)
{
TDataSet *ADataSet = ((TcxGridDBTableView*)cxGrid->FocusedView)->DataController->DataSet;
TcxGridDBColumn *AColumn = ((TcxGridDBTableView*)cxGrid->FocusedView)->Columns[AItemIndex];
bool AIsLookupColumn = (AColumn->PropertiesClass == __classid(TcxLookupComboBoxProperties));
try{
Screen->Cursor = crHourGlass;
GridModeDemoDataDM->qryHelper->SQL->Clear();
GridModeDemoDataDM->qryHelper->SQL->Add(
"Select DISTINCT " + AColumn->DataBinding->FieldName + " From " +
GridModeDemoDataDM->GetTableNameByDataSet(ADataSet));
GridModeDemoDataDM->qryHelper->SQL->Add(
GetSQLCondition((TcxGridDBTableView*)cxGrid->FocusedView, false));
GridModeDemoDataDM->qryHelper->Open();
GridModeDemoDataDM->qryHelper->First();
while (!GridModeDemoDataDM->qryHelper->Eof){
Variant ADisplayValue = GridModeDemoDataDM->qryHelper->Fields->Fields[0]->Value;
if (AIsLookupColumn){
TcxLookupComboBoxProperties *AProperties =
(TcxLookupComboBoxProperties*)AColumn->GetProperties();
ADataSet = AProperties->ListSource->DataSet;
ADisplayValue = ADataSet->Lookup(
AProperties->KeyFieldNames,ADisplayValue, AProperties->ListFieldNames);
}
if (VarIsNull(ADisplayValue)) return;
AValueList->Add(fviValue, GridModeDemoDataDM->qryHelper->Fields->Fields[0]->Value,
ADisplayValue, false);
GridModeDemoDataDM->qryHelper->Next();
}
GridModeDemoDataDM->qryHelper->Close();
}
__finally{
Screen->Cursor = crDefault;
}
}
//---------------------------------------------------------------------------
void TGridModeDemoMainForm::SortClone(TcxGridDBDataController *ADataController)
{
TcxCustomGridTableView *AView = ADataController->GridView;
if (!AView->PatternGridView->IsPattern) return;
TcxGridDBTableView* APatternView = ((TcxGridDBTableView*)AView->PatternGridView);
try{
AView->BeginUpdate();
APatternView->BeginUpdate();
APatternView->DataController->ClearSorting(false);
for (int I = 0; I < AView->SortedItemCount; I++){
String AFieldName =
((TcxGridDBColumn*)AView->SortedItems[I])->DataBinding->FieldName;
TcxGridDBColumn *AColumn =
APatternView->GetColumnByFieldName(AFieldName);
if (AColumn->SortOrder != AView->SortedItems[I]->SortOrder)
AColumn->SortOrder = AView->SortedItems[I]->SortOrder;
}
}
__finally{
APatternView->EndUpdate();
AView->EndUpdate();
}
}
//---------------------------------------------------------------------------
void TGridModeDemoMainForm::SortPattern(TcxGridDBDataController *ADataController)
{
TcxGridDBTableView *AView = (TcxGridDBTableView*)ADataController->GridView;
TStrings *ASortList = new TStringList();
try{
AView->BeginUpdate();
String AOrder, AFieldName;
int AIndex;
for (int I = 0; I < AView->SortedItemCount; I++){
AIndex = ADataController->GetSortingItemIndex(I);
AFieldName = AView->Columns[AIndex]->DataBinding->FieldName;
if (AView->Columns[AIndex]->SortOrder == soAscending)
AOrder = " ASC, ";
else
AOrder = " DESC, ";
ASortList->Add(AFieldName + AOrder);
}
GridModeDemoDataDM->
ApplySortToQuery((TQuery*)ADataController->DataSet, ASortList);
}
__finally{
delete ASortList;
AView->EndUpdate();
}
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::tvDataControllerSortingChanged(TObject *Sender)
{
try{
Screen->Cursor = crHourGlass;
TcxGridDBDataController *ADataCOntroller = (TcxGridDBDataController*)Sender;
TcxCustomGridTableView *AGridView = ADataCOntroller->GridView;
if (AGridView->IsMaster || AGridView->IsPattern)
SortPattern(ADataCOntroller);
else
SortClone(ADataCOntroller);
}
__finally{
Screen->Cursor = crDefault;
}
}
//---------------------------------------------------------------------------
String TGridModeDemoMainForm::SummaryKindToStr(TcxSummaryKind AKind)
{
switch (AKind){
case skSum:
return "SUM";
case skMin:
return "MIN";
case skMax:
return "MAX";
case skCount:
return "Count";
case skAverage:
return "AVG";
}
return "";
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::tvOrdersDataControllerSummaryAfterSummary(
TcxDataSummary *ASender)
{
TcxGridDBDataController *ADataController = (TcxGridDBDataController*)ASender->DataController;
TcxGridDBTableView *AView = (TcxGridDBTableView*)ADataController->GridView;
try{
Screen->Cursor = crHourGlass;
if (!AView->IsPattern && ADataController->DataSet->Active){
String AFieldName, AStr = "Select ";
for (int I = 0; I < ASender->FooterSummaryItems->Count; I++){
AFieldName =
((TcxGridDBTableSummaryItem*)ASender->FooterSummaryItems->Items[I])->FieldName;
AStr = AStr + SummaryKindToStr(ASender->FooterSummaryItems->Items[I]->Kind)+
"(" + AFieldName + "), ";
}
AStr.Delete(AStr.Length()-1, 2);
if (ADataController->DataSet == NULL) return;
if ((ADataController->DataSet->State == dsBrowse) &&
((TQuery*)ADataController->DataSet)->UpdatesPending)
((TQuery*)ADataController->DataSet)->ApplyUpdates();
AStr = AStr + " From " +
GridModeDemoDataDM->GetTableNameByDataSet(ADataController->DataSet);
GridModeDemoDataDM->qryHelper->SQL->Clear();
GridModeDemoDataDM->qryHelper->SQL->Add(AStr);
GridModeDemoDataDM->qryHelper->SQL->Add(GetSQLCondition(AView, true));
GridModeDemoDataDM->qryHelper->Open();
GridModeDemoDataDM->qryHelper->First();
for (int I = 0; I < ASender->FooterSummaryItems->Count; I++)
ASender->FooterSummaryValues[I] =
GridModeDemoDataDM->qryHelper->Fields->Fields[I]->Value;
GridModeDemoDataDM->qryHelper->Close();
}
}
__finally{
Screen->Cursor = crDefault;
}
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::DoStepItforProgressBar(TObject *Sender)
{
ProgressBar->StepIt();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::btnPopulateClick(TObject *Sender)
{
if (MessageDlg("This operation will take some time, Continue ?",
mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes){
pnlProgress->Visible = true;
GridModeDemoDataDM->OnPopulateProgress = DoStepItforProgressBar;
GridModeDemoDataDM->qryOrdersPopulate();
pnlProgress->Visible = false;
tvCars->DataController->ClearDetails();
btnPopulate->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if (GridModeDemoDataDM->IsOrdersPopulated()){
if (!(MessageDlg("Do you want to delete previously inserted records ?",
mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)) return;
GridModeDemoDataDM->ClearOrders();
}
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::miRecreateDBClick(TObject *Sender)
{
GridModeDemoDataDM->CopyDBToLocalPlace(true);
InitPopulateButton();
}
//---------------------------------------------------------------------------
void __fastcall TGridModeDemoMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
delete GridModeDemoTerminateForm;
GridModeDemoTerminateForm = NULL;
}
//---------------------------------------------------------------------------
void TGridModeDemoMainForm::InitPopulateButton()
{
btnPopulate->Enabled = !GridModeDemoDataDM->IsOrdersPopulated();
}
//---------------------------------------------------------------------------
String TGridModeDemoMainForm::GetSQLCondition(TcxGridDBTableView *AView, bool AAddFilter)
{
String Result = "",
AStr = "where ";
TcxGridDBDataController *ADataController = AView->DataController;
if (AView->IsDetail){
AStr = " and ";
String AFieldName = ADataController->DetailKeyFieldNames;
String AMasterKeyFieldName = ADataController->MasterKeyFieldNames;
TcxGridDBTableView *AMasterGridView =
(TcxGridDBTableView*)AView->MasterGridView;
TDataSet *AMasterDataSet = AMasterGridView->DataController->DataSet;
Variant AMasterKeyValue = AMasterDataSet->FindField(AMasterKeyFieldName)->Value;
Result = "where " + AFieldName + " = " + VarToStr(AMasterKeyValue);
}
if (AAddFilter && !ADataController->Filter->IsEmpty() && ADataController->Filter->Active)
Result = Result + AStr + ADataController->Filter->FilterText;
return Result;
}
//---------------------------------------------------------------------------