From e8fd377ff9c51bc9326b29bbfdcf9eda8c499a13 Mon Sep 17 00:00:00 2001 From: alexs75 Date: Tue, 5 Aug 2014 12:51:26 +0000 Subject: [PATCH] RxDBGrid - new tools - TRxDBGridPrint (based on TFrPrintGrid) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3427 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/rx/trunk/docs/makehtml.sh | 5 +- components/rx/trunk/docs/rxfpc.xml | 63 +++ components/rx/trunk/rxdbgrid.pas | 4 +- .../rx/trunk/rxdbgrid_export_spreadsheet.lpk | 4 +- components/rx/trunk/rxdbgrid_print.lpk | 37 ++ components/rx/trunk/rxdbgrid_print.pas | 21 + .../rx/trunk/rxdbgridexportspreadsheet.pas | 2 - components/rx/trunk/rxdbgridprintgrid.pas | 370 ++++++++++++++++++ 8 files changed, 499 insertions(+), 7 deletions(-) create mode 100644 components/rx/trunk/rxdbgrid_print.lpk create mode 100644 components/rx/trunk/rxdbgrid_print.pas create mode 100644 components/rx/trunk/rxdbgridprintgrid.pas diff --git a/components/rx/trunk/docs/makehtml.sh b/components/rx/trunk/docs/makehtml.sh index 02e756f7d..6c1cb11b5 100755 --- a/components/rx/trunk/docs/makehtml.sh +++ b/components/rx/trunk/docs/makehtml.sh @@ -29,5 +29,6 @@ fpdoc --package=rxfpc --format=html --index-colcount=4 --hide-protected \ --input=../rxaboutformunit.pas --descr=rxfpc.xml \ --input=../rxaboutdialog.pas --descr=rxfpc.xml \ --input=../dateutil.pas --descr=rxfpc.xml \ - --input=../rxfileutils.pas --descr=rxfpc.xml - + --input=../rxfileutils.pas --descr=rxfpc.xml \ + --input=../rxdbgridexportspreadsheet_paramsunit.pas --descr=rxfpc.xml \ + --input=../rxdbgridexportspreadsheet.pas --descr=rxfpc.xml diff --git a/components/rx/trunk/docs/rxfpc.xml b/components/rx/trunk/docs/rxfpc.xml index c1ab0077b..c11bd9ae0 100644 --- a/components/rx/trunk/docs/rxfpc.xml +++ b/components/rx/trunk/docs/rxfpc.xml @@ -165,6 +165,9 @@ + + + RxDBGrid-а.

@@ -570,6 +573,9 @@ + + + RxDBGrid-а.

@@ -1158,6 +1164,9 @@ TRxDBCalcEdit является наследником TDBCalcEdit и имеет + + + @@ -2437,6 +2446,9 @@ Description + + + @@ -2461,6 +2473,9 @@ Description + + + @@ -2485,6 +2500,9 @@ Description + + + @@ -2509,6 +2527,9 @@ Description + + + @@ -2554,6 +2575,9 @@ Description + + + const DirName: @@ -2572,6 +2596,9 @@ Description + + + string): @@ -2590,6 +2617,9 @@ Description + + + string;

Функция проверяет все разделители каталогов в указанном имени файла/каталога и, если нужно, меняет их на значение константыDirectorySeparator.

@@ -2618,6 +2648,9 @@ Description + + + @@ -2897,4 +2930,34 @@ Description Cодержит компоненту TRxSystemServices. + + + + + Параметры экспорта в электрунную таблицу + + + Параметры экспорта в электрунную таблицу + + + + + + + Модуль rxdbgridexportspreadsheet содержит класс для экспорта данных из TRxDBGrid в электронную таблицу + Модуль rxdbgridexportspreadsheet содержит класс для экспорта данных из TRxDBGrid в электронную таблицу + + Параметры экспорта в электрунную таблицу + + + + + + + + + Модуль rxdbgridexportspreadsheet_paramsunit содержит окно формы параметров экспорта данных из TRxDBGrid в электронную таблицу + Модуль rxdbgridexportspreadsheet_paramsunit содержит окно формы параметров экспорта данных из TRxDBGrid в электронную таблицу + + diff --git a/components/rx/trunk/rxdbgrid.pas b/components/rx/trunk/rxdbgrid.pas index dff23e8f0..28738a10d 100644 --- a/components/rx/trunk/rxdbgrid.pas +++ b/components/rx/trunk/rxdbgrid.pas @@ -1,6 +1,6 @@ { rxdbgrid unit - Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team + Copyright (C) 2005-2014 Lagunov Aleksey alexs@yandex.ru and Lazarus team original conception from rx library for Delphi (c) This library is free software; you can redistribute it and/or modify it @@ -1033,7 +1033,7 @@ end; function TRxDBGridAbstractTools.Execute: boolean; begin - Result:=false; + Result:=true; if Assigned(FOnBeforeExecute) then FOnBeforeExecute(Self); diff --git a/components/rx/trunk/rxdbgrid_export_spreadsheet.lpk b/components/rx/trunk/rxdbgrid_export_spreadsheet.lpk index 50a40b141..c5faf841d 100644 --- a/components/rx/trunk/rxdbgrid_export_spreadsheet.lpk +++ b/components/rx/trunk/rxdbgrid_export_spreadsheet.lpk @@ -2,13 +2,15 @@ + - + + diff --git a/components/rx/trunk/rxdbgrid_print.lpk b/components/rx/trunk/rxdbgrid_print.lpk new file mode 100644 index 000000000..d17db2471 --- /dev/null +++ b/components/rx/trunk/rxdbgrid_print.lpk @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/rx/trunk/rxdbgrid_print.pas b/components/rx/trunk/rxdbgrid_print.pas new file mode 100644 index 000000000..f8aec33f1 --- /dev/null +++ b/components/rx/trunk/rxdbgrid_print.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit rxdbgrid_print; + +interface + +uses + RxDBGridPrintGrid, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('RxDBGridPrintGrid', @RxDBGridPrintGrid.Register); +end; + +initialization + RegisterPackage('rxdbgrid_print', @Register); +end. diff --git a/components/rx/trunk/rxdbgridexportspreadsheet.pas b/components/rx/trunk/rxdbgridexportspreadsheet.pas index cf53f7233..3985ddf49 100644 --- a/components/rx/trunk/rxdbgridexportspreadsheet.pas +++ b/components/rx/trunk/rxdbgridexportspreadsheet.pas @@ -49,8 +49,6 @@ type type - { TRxDBGridExportSpeadSheet } - { TRxDBGridExportSpreadSheet } TRxDBGridExportSpreadSheet = class(TRxDBGridAbstractTools) diff --git a/components/rx/trunk/rxdbgridprintgrid.pas b/components/rx/trunk/rxdbgridprintgrid.pas new file mode 100644 index 000000000..2363970ee --- /dev/null +++ b/components/rx/trunk/rxdbgridprintgrid.pas @@ -0,0 +1,370 @@ +{ rxdbgrid unit + + Copyright (C) 2005-2014 Lagunov Aleksey alexs@yandex.ru and Lazarus team + original conception from rx library for Delphi (c) + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version with the following modification: + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules,and + to copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the terms + and conditions of the license of that module. An independent module is a + module which is not derived from or based on this library. If you modify + this library, you may extend this exception to your version of the library, + but you are not obligated to do so. If you do not wish to do so, delete this + exception statement from your version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit RxDBGridPrintGrid; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, DB, rxdbgrid, LR_Class, LR_DSet, LR_DBSet, contnrs, + Graphics, Printers; + +type + TRxDBGridPrintOption = (rxpoShowTitle, rxpoShowFooter, rxpoShowFooterColor); + TRxDBGridPrintOptions = set of TRxDBGridPrintOption; + + { TRxColInfo } + + TRxColInfo = class + Col:TRxColumn; + ColWidth:integer; + ColTitles:TStringList; + constructor Create; + destructor Destroy; override; + end; + + { TRxDBGridPrint } + + TRxDBGridPrint = class(TRxDBGridAbstractTools) + private + FOptions: TRxDBGridPrintOptions; + FOrientation: TPrinterOrientation; + FReport : TfrReport; + FReportDataSet : TfrDBDataSet; + FColumnDataSet : TfrUserDataSet; + FDataSet : TDataset; + FPage : TfrPage; + + FShowProgress : Boolean; + FTitleRowCount : integer; + FRxColInfoList : TObjectList; + + FYPos: Integer; + FXPos: Integer; + procedure DoCreateReport; + procedure DoSetupColumns; + procedure DoShowTitle; + procedure DoShowFooter; + procedure OnPrintColumn(ColNo: Integer; var Width: Integer); + procedure OnEnterRect(Memo: TStringList; View: TfrView); + protected + function DoExecTools:boolean;override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure PreviewReport; + published + property Orientation: TPrinterOrientation read FOrientation write FOrientation default poPortrait; + property Options:TRxDBGridPrintOptions read FOptions write FOptions; + property ShowProgress : Boolean read FShowProgress write FShowProgress default false; + end; + +procedure Register; +implementation + +uses math; + +procedure Register; +begin + RegisterComponents('RX DBAware',[TRxDBGridPrint]); +end; + +{ TRxColInfo } + +constructor TRxColInfo.Create; +begin + inherited Create; + ColTitles:=TStringList.Create; +end; + +destructor TRxColInfo.Destroy; +begin + ColTitles.Clear; + FreeAndNil(ColTitles); + inherited Destroy; +end; + +{ TRxDBGridPrint } + +procedure TRxDBGridPrint.DoCreateReport; +var + FBand: TfrBandView; + FView: TfrMemoView; +begin + if FReport.Pages.Count=0 then + FReport.Pages.add; + FPage := FReport.Pages[FReport.Pages.Count-1]; + FPage.ChangePaper(FPage.pgSize, FPage.Width, FPage.Height, FOrientation); + + FYPos:=0; + FXPos:=20; + + DoShowTitle; + + FBand := TfrBandView(frCreateObject(gtBand, '', FPage)); + FBand.BandType := btMasterData; + FBand.Dataset := FReportDataSet.Name; + FBand.SetBounds(0, FYPos, 1000, 18); + FBand.Flags:=FBand.Flags or flStretched; + FPage.Objects.Add(FBand); + + FBand := TfrBandView(frCreateObject(gtBand, '', FPage)); + FBand.BandType := btCrossData; + FBand.Dataset := FColumnDataSet.Name; + FBand.SetBounds(FXPos, 0, 20, 1000); + FPage.Objects.Add(FBand); + + FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView; + FView.SetBounds(FXPos, FYPos, 20, 18); + FView.Memo.Add('[Cell]'); + FView.Flags:=FView.Flags or flStretched; + FView.Font.Size:=10; +// FView.Font.Assign(FFont); + FView.Frames:=frAllFrames; + FView.Layout:=tlTop; + FPage.Objects.Add(FView); + + FYPos := FYPos + 22; + + if (RxDBGrid.FooterOptions.Active) and (RxDBGrid.FooterOptions.RowCount>0) then + DoShowFooter; +end; + +procedure TRxDBGridPrint.DoSetupColumns; +var + P:TRxColInfo; + i: Integer; + j: Integer; +begin + FTitleRowCount:=0; + FRxColInfoList.Clear; + for i:=0 to RxDBGrid.Columns.Count-1 do + begin + if RxDBGrid.Columns[i].Visible then + begin + P:=TRxColInfo.Create; + FRxColInfoList.Add(P); + P.Col:=RxDBGrid.Columns[i] as TRxColumn; + P.ColWidth:=RxDBGrid.Columns[i].Width; + for j:=0 to TRxColumnTitle(RxDBGrid.Columns[i].Title).CaptionLinesCount-1 do + P.ColTitles.Add(TRxColumnTitle(RxDBGrid.Columns[i].Title).CaptionLine(j).Caption); + FTitleRowCount:=Max(FTitleRowCount, P.ColTitles.Count) + end; + end; +end; + +procedure TRxDBGridPrint.DoShowTitle; +var + FBand: TfrBandView; + FView: TfrMemoView; + i: Integer; +begin + FBand := TfrBandView(frCreateObject(gtBand, '', FPage)); + FBand.BandType := btMasterHeader; + +{!! + if self.fShowHdOnAllPage then + FBand.Flags:=FBand.Flags+flBandRepeatHeader; +} + FBand.SetBounds(FXPos, FYPos, 1000, 20 * FTitleRowCount); + FBand.Flags:=FBand.Flags or flStretched; + FPage.Objects.Add(FBand); + + for i:=0 to FTitleRowCount-1 do + begin + FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView; + FView.SetBounds(FXPos, FYPos, 20, 20); + FView.Alignment:=taCenter; + FView.FillColor := clSilver; + // FView.Font.Assign(FTitleFont); + FView.Font.Size:=12; + FView.Frames:=frAllFrames; + FView.Layout:=tlTop; + FView.Memo.Add(Format('Header_%d', [i])); + FPage.Objects.Add(FView); + FYPos:=FYPos + 20 + end; + FYPos := FYPos + 2; +end; + +procedure TRxDBGridPrint.DoShowFooter; +var + FBand: TfrBandView; + FView: TfrMemoView; + i: Integer; +begin + FBand := TfrBandView(frCreateObject(gtBand, '', FPage)); + FBand.BandType := btMasterFooter; + +{!! + if self.fShowHdOnAllPage then + FBand.Flags:=FBand.Flags+flBandRepeatHeader; +} + FBand.SetBounds(FXPos, FYPos, 1000, 20); + FBand.Flags:=FBand.Flags or flStretched; + FPage.Objects.Add(FBand); + + FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView; + FView.SetBounds(FXPos, FYPos, 20, 20); + FView.Alignment:=taCenter; + FView.FillColor := RxDBGrid.FooterOptions.Color; +// FView.Font.Assign(FTitleFont); + FView.Font.Size:=12; + FView.Frames:=frAllFrames; + FView.Layout:=tlTop; + FView.Memo.Add(Format('Footer', [i])); + FPage.Objects.Add(FView); + + FYPos := FYPos + 22; +end; + +procedure TRxDBGridPrint.OnPrintColumn(ColNo: Integer; var Width: Integer); +begin + if (ColNo > 0) and (ColNo <= FRxColInfoList.Count) then + Width := TRxColInfo(FRxColInfoList[ColNo-1]).ColWidth; +end; + +procedure TRxDBGridPrint.OnEnterRect(Memo: TStringList; View: TfrView); +var + C: TRxColumn; + i, k: Integer; + F:TRxColInfo; + S: String; +begin + i := FColumnDataset.RecNo; + + if (i >= 0) and (i < FRxColInfoList.Count) then + begin + F:=TRxColInfo(FRxColInfoList[i]); + View.dx := F.ColWidth; + + if Assigned(F.Col) and (Memo.Count>0) then + begin + S:=Memo[0]; + if (S='[Cell]') and Assigned(F.Col.Field) then + begin + Memo[0] := F.Col.Field.DisplayText; + TfrMemoView(View).Alignment:=F.Col.Alignment; + end + else + if Copy(S, 1, 7) = 'Header_' then + begin + TfrMemoView(View).Alignment:=F.Col.Title.Alignment; + K:=StrToIntDef(Copy(S, 8, Length(S)), 0); + if TRxColumnTitle(F.Col.Title).CaptionLinesCount = 0 then + begin + if K = 0 then + Memo[0] := TRxColumnTitle(F.Col.Title).Caption + else + Memo[0] := ''; + end + else + if K