📄 gridmodedemomain.pas
字号:
BeginUpdate;
SetLength(ASortArray, SortedItemCount);
for I := 0 to SortedItemCount - 1 do
begin
AFieldName := TcxGridDBColumn(SortedItems[I]).DataBinding.FieldName;
if SortedItems[I].SortOrder = soAscending then
AOrder := ' ASC, '
else
AOrder := ' DESC, ';
ASortArray[SortedItems[I].SortIndex] := AFieldName + AOrder;
end;
ApplySortToQuery(
TQuery(TcxGridDBDataController(DataController).DataSet), ASortArray);
finally
EndUpdate;
end;
end;
var
AGridView: TcxCustomGridTableView;
begin
try
Screen.Cursor := crHourGlass;
AGridView := TcxGridDBDataController(Sender).GridView;
if AGridView.IsMaster or AGridView.IsPattern then
SortPattern
else
SortClone;
finally
Screen.Cursor := crDefault;
end;
end;
procedure TGridModeDemoMainForm.tvOrdersDataControllerSummaryAfterSummary(
ASender: TcxDataSummary);
function SummaryKindToStr(AKind: TcxSummaryKind): string;
begin
case AKind of
skSum:
Result := 'SUM';
skMin:
Result := 'MIN';
skMax:
Result := 'MAX';
skCount:
Result := 'Count';
skAverage:
Result := 'AVG';
else
Result := ''
end;
end;
var
I: Integer;
AStr, AFieldName: string;
ADataController: TcxGridDBDataController;
AView: TcxGridDBTableView;
begin
ADataController := TcxGridDBDataController(ASender.DataController);
AView := TcxGridDBTableView(ADataController.GridView);
if not AView.IsPattern and ADataController.dataSet.Active then
with GridModeDemoDataDM do
try
Screen.Cursor := crHourGlass;
AStr := 'Select ';
for I := 0 to ASender.FooterSummaryItems.Count - 1 do
begin
AFieldName :=
TcxGridDBTableSummaryItem(ASender.FooterSummaryItems[I]).FieldName;
AStr := AStr + SummaryKindToStr(ASender.FooterSummaryItems[I].Kind)+
'(' + AFieldName + '), ';
end;
Delete(AStr, Length(AStr)-1, 2);
if not Assigned(ADataController.DataSet) then exit;
if (ADataController.DataSet.State = dsBrowse) and
TQuery(ADataController.DataSet).UpdatesPending then
TQuery(ADataController.DataSet).ApplyUpdates;
AStr := AStr + ' From ' + GetTableNameByDataSet(ADataController.DataSet);
qryHelper.SQL.Clear;
qryHelper.SQL.Add(AStr);
qryHelper.SQL.Add(GetSQLCondition(AView, True));
qryHelper.Open;
qryHelper.First;
for I := 0 to ASender.FooterSummaryItems.Count - 1 do
ASender.FooterSummaryValues[I] := qryHelper.Fields[I].Value;
qryHelper.Close;
finally
Screen.Cursor := crDefault;
end;
end;
procedure TGridModeDemoMainForm.btnPopulateClick(Sender: TObject);
begin
if MessageDlg('This operation will take some time, continue?',
mtWarning, [mbYES,mbNO], 0) = mrYes then
begin
tblOrdersPopulate;
btnPopulate.Enabled := False;
end;
end;
procedure TGridModeDemoMainForm.tblOrdersPopulate;
procedure FillList(AList: TList; ADataSet: TDataSet; AKeyFieldName: string);
var
ABookmark: TBookmarkStr;
AKeyValue: Integer;
begin
try
ADataSet.DisableControls;
ABookmark := ADataSet.Bookmark;
ADataSet.First;
while not ADataSet.Eof do
begin
AKeyValue := Integer(ADataSet.FindField(AKeyFieldName).Value);
AList.Add(TObject(AKeyValue));
ADataSet.Next;
end;
finally
ADataSet.Bookmark := ABookmark;
ADataSet.EnableControls;
end;
end;
const APaymentTypes: array[0..3] of string = ('AmEx','Cash','Visa','Master');
var
ACarList, ACustomersList: TList;
I, ARecordNo: Integer;
ADateTime: TDateTime;
begin
ACarList := TList.Create;
ACustomersList := TList.Create;
with GridModeDemoDataDM do
begin
FillList(ACarList, qryCars, 'ID');
FillList(ACustomersList, qryCustomers, 'ID');
try
Screen.Cursor := crHourGlass;
qryOrders.DisableControls;
qryOrders.Close;
qryHelper.SQL.Clear;
qryHelper.SQL.Add('Select * from orders');
qryHelper.Open;
qryHelper.Last;
FStartIDValue := qryHelper.FindField('ID').Value;
ADateTime := Date;
Randomize;
pnlProgress.Visible := True;
Application.ProcessMessages;
for I := 0 to 100000 do
begin
if (I > 0) and (I mod 100 = 0) then
ProgressBar.StepIt;
qryHelper.Append;
ARecordNo := Random(ACustomersList.Count);
qryHelper.FindField('CustomerID').Value :=
Integer(ACustomersList[ARecordNo]);
ARecordNo := Random(ACarList.Count);
qryHelper.FindField('ProductID').Value := Integer(ACarList[ARecordNo]);
qryHelper.FindField('PurchaseDate').Value := ADateTime - Random(1095);
qryHelper.FindField('PaymentType').Value := APaymentTypes[Random(4)];
qryHelper.FindField('PaymentAmount').Value := 20000 + Random(500000);
qryHelper.Post;
end;
pnlProgress.Visible := False;
finally
FEndIDValue := qryHelper.FindField('ID').Value;
qryHelper.Close;
qryOrders.Open;
qryOrders.EnableControls;
Screen.Cursor := crDefault;
end;
end;
end;
function TGridModeDemoMainForm.GetSQLCondition(
AView: TcxGridDBTableView; AAddFilter: Boolean): string;
var
AFieldName, AMasterKeyFieldName: string;
AMasterGridView: TcxGridDBTableView;
ADataController: TcxGridDBDataController;
AMasterDataSet: TDataSet;
AMasterKeyValue: Variant;
AStr: string;
begin
Result := '';
AStr := 'where ';
ADataController := AView.DataController;
if AView.IsDetail then
begin
AStr := ' and ';
AFieldName := ADataController.DetailKeyFieldNames;
AMasterKeyFieldName := ADataController.MasterKeyFieldNames;
AMasterGridView := TcxGridDBTableView(AView.MasterGridView);
AMasterDataSet := AMasterGridView.DataController.DataSet;
AMasterKeyValue := AMasterDataSet.FindField(AMasterKeyFieldName).Value;
Result := 'where ' + AFieldName + ' = ' + VarToStr(AMasterKeyValue);
end;
if AAddFilter and not ADataController.Filter.IsEmpty and ADataController.Filter.Active then
begin
Result := Result + AStr + ADataController.Filter.FilterText;
end;
end;
procedure TGridModeDemoMainForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if FStartIDValue <> FEndIDValue then
with GridModeDemoDataDM do
begin
if not (MessageDlg('Do you want to delete previously inserted records?',
mtConfirmation, [mbYes,mbNo], 0) = mrYes) then Exit;
GridModeDemoTerminateForm.lbDesc.Caption := strDeleting;
GridModeDemoTerminateForm.Show;
try
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
qryHelper.SQL.Clear;
qryHelper.SQL.Add('delete from Orders ');
qryHelper.SQL.Add('where ID > ' + IntToStr(FStartIDValue));
qryHelper.SQL.Add('and ID <= ' + IntToStr(FEndIDValue));
qryHelper.ExecSQL;
finally
GridModeDemoTerminateForm.Close;
Screen.Cursor := crDefault;
end;
end;
end;
procedure TGridModeDemoMainForm.FormCreate(Sender: TObject);
begin
try
GridModeDemoTerminateForm := TGridModeDemoTerminateForm.Create(nil);
GridModeDemoTerminateForm.lbDesc.Caption := strLoadData;
GridModeDemoTerminateForm.Show;
Application.ProcessMessages;
CopyDBToLocalPlace(False);
OpenTables(True);
InitPopulateButton;
finally
GridModeDemoTerminateForm.Close;
end;
end;
procedure TGridModeDemoMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
FreeAndNil(GridModeDemoTerminateForm);
end;
procedure TGridModeDemoMainForm.OpenTables(AOpen: Boolean);
begin
with GridModeDemoDataDM do
try
Screen.Cursor := crHourGlass;
DataBase.Connected := False;
qryCars.Active := AOpen;
qryOrders.Active := AOpen;
qryCustomers.Active := AOpen;
finally
Screen.Cursor := crDefault;
end;
end;
procedure TGridModeDemoMainForm.CopyDBToLocalPlace(ARewrite: Boolean);
function CopyTableToCurrentDir(ATableName: string): Boolean;
var
ASearchRec: TSearchRec;
begin
Result := False;
if FindFirst(DataPath + ATableName + '.*', faAnyFile, ASearchRec) = 0 then
begin
Result :=
CopyFile(PChar(DataPath + ASearchRec.Name),
PChar(ASearchRec.Name), False);
while FindNext(ASearchRec) = 0 do
Result := Result and
CopyFile(PChar(DataPath + ASearchRec.Name),
PChar(ASearchRec.Name), False);
FindClose(ASearchRec);
end;
end;
var
I: Integer;
AEnablePopulate: Boolean;
begin
try
Screen.Cursor := crHourGlass;
OpenTables(False);
AEnablePopulate := True;
for I := Low(CarsTableNames) to High(CarsTableNames) do
if ARewrite or not FileExists(CarsTableNames[I] + '.DB') then
AEnablePopulate := AEnablePopulate and
CopyTableToCurrentDir(CarsTableNames[I]);
finally
OpenTables(True);
Screen.Cursor := crDefault;
end;
if AEnablePopulate then
begin
btnPopulate.Enabled := True;
FStartIDValue := 0;
FEndIDValue := 0;
end;
end;
procedure TGridModeDemoMainForm.InitPopulateButton;
begin
with GridModeDemoDataDM do
begin
qryHelper.SQL.Clear;
qryHelper.SQL.Add('Select Count(ID) from Orders');
qryHelper.Open;
btnPopulate.Enabled := qryHelper.Fields[0].AsInteger < 100000;
qryHelper.Close;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -