📄 rm_formreport.pas
字号:
unit RM_FormReport;
{$I RM.INC}
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, DB,
Forms, StdCtrls, Dialogs, Menus, Buttons, Comctrls, ExtCtrls, DBCtrls, RM_const,
RM_DataSet, RM_Class, RM_Preview, RM_Printer, RM_Common, RM_GridReport
{$IFDEF COMPILER6_UP}, Variants{$ENDIF};
type
TRMGridReportOption = (rmgoUseColor, rmgoStretch, rmgoWordWrap, rmgoGridLines,
rmgoSelectedRecordsOnly, rmgoAppendBlank, rmgoGridNumber, rmgoDrawBorder,
rmgoDoubleFrame, rmgoRebuildAfterPageChanged, rmgoDisableControls);
TRMGridReportOptions = set of TRMGridReportOption;
TRMFRScaleMode = (rmsmAdjust, rmsmFit);
TRMCustomFormReport = class;
TRMFormReport = class;
TRMOnPrintObjectEvent = procedure(aFormReport: TRMFormReport; aPage: TRMReportPage;
aControl: TControl; var aPrintObjectClass: TClass; var OwnerDraw: Boolean) of object;
TRMOnAfterCreateObjectEvent = procedure(aControl: TControl; aView: TRMView) of object;
TRMOnAfterCreateGridObjectEvent = procedure(aControl: TControl; aFieldName: string; aView: TRMView) of object;
{ TRMPageLayout }
TRMPageLayout = class(TPersistent)
private
FColumnCount: Integer;
FColumnGap: Integer;
FPageSize: Word;
FLeftMargin: integer;
FTopMargin: integer;
FBottomMargin: integer;
FRightMargin: integer;
FPageHeight: integer;
FPageWidth: integer;
FPageOr: TRMPrinterOrientation;
FPageBin: integer;
FPrinterName: string;
FDoublePass: Boolean;
FPrintBackColor: Boolean;
FTitle: string;
protected
public
constructor Create;
procedure Assign(Source: TPersistent); override;
published
property ColumnCount: Integer read FColumnCount write FColumnCount default 1;
property ColumnGap: Integer read FColumnGap write FColumnGap default 0;
property PageSize: Word read FPageSize write FPageSize default 9;
property LeftMargin: integer read FLeftMargin write FLeftMargin default 36;
property TopMargin: integer read FTopMargin write FTopMargin default 36;
property RightMargin: integer read FRightMargin write FRightMargin default 36;
property BottomMargin: integer read FBottomMargin write FBottomMargin default 36;
property Height: integer read FPageHeight write FPageHeight default 2100;
property Width: integer read FPageWidth write FPageWidth default 2970;
property PageOrientation: TRMPrinterOrientation read FPageOr write FPageOr default rmpoPortrait;
property PageBin: integer read FPageBin write FPageBin;
property PrinterName: string read FPrinterName write FPrinterName;
property DoublePass: Boolean read FDoublePass write FDoublePass default False;
property ColorPrint: Boolean read FPrintBackColor write FPrintBackColor;
property Title: string read FTitle write FTitle;
end;
{ TRMPageHeaderFooter }
TRMPageHeaderFooter = class(TPersistent)
private
FCaption: TStrings;
FHeight: Integer;
procedure SetCaption(Value: TStrings);
procedure SetHeight(Value: Integer);
protected
ParentFormReport: TRMCustomFormReport;
procedure GetStrings(aStrings: TStrings);
public
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure Clear;
procedure Add(const AStr: string; AFont: TFont; Align: TAlignment);
procedure LoadFromRichEdit(ARichEdit: TRichEdit);
published
property Caption: TStrings read FCaption write SetCaption;
property Height: Integer read FHeight write SetHeight default 20;
end;
{ TRMGridNumOptions }
TRMGridNumOptions = class(TPersistent)
private
FText: string;
FNumber: integer;
procedure SetNumber(Value: Integer);
public
constructor Create;
procedure Assign(Source: TPersistent); override;
published
property Text: string read FText write FText;
property Number: integer read FNumber write SetNumber default 7;
end;
{ TRMScaleOptions }
TRMScaleOptions = class(TPersistent)
private
FCenterOnPageH: Boolean;
FCenterOnPageV: Boolean;
FFitPageWidth: Boolean;
FFitPageHeight: Boolean;
FScaleMode: TRMFRScaleMode;
FScaleFactor: Integer;
protected
public
constructor Create;
procedure Assign(Source: TPersistent); override;
published
property CenterOnPageH: Boolean read FCenterOnPageH write FCenterOnPageH default False;
property CenterOnPageV: Boolean read FCenterOnPageV write FCenterOnPageV default False;
property FitPageWidth: Boolean read FFitPageWidth write FFitPageWidth default False;
property FitPageHeight: Boolean read FFitPageHeight write FFitPageHeight default False;
property ScaleMode: TRMFRScaleMode read FScaleMode write FScaleMode default rmsmAdjust;
property ScaleFactor: Integer read FScaleFactor write FScaleFactor default 100;
end;
{ TRMGroupItem }
TRMGroupItem = class(TCollectionItem)
private
FGroupFieldName: string;
FFormNewPage: Boolean;
function GetReport: TComponent;
protected
public
constructor Create(Collection: TCollection); override;
procedure Assign(Source: TPersistent); override;
property Report: TComponent read GetReport;
published
property GroupFieldName: string read FGroupFieldName write FGroupFieldName;
property FormNewPage: Boolean read FFormNewPage write FFormNewPage default False;
end;
{ TRMGroupItems }
TRMGroupItems = class(TCollection)
private
FReport: TComponent;
function GetItem(Index: Integer): TRMGroupItem;
procedure SetItem(Index: Integer; Value: TRMGroupItem);
protected
function GetOwner: TPersistent; override;
procedure Update(Item: TCollectionItem); override;
public
constructor Create(aReport: TComponent);
function Add: TRMGroupItem;
property Report: TComponent read FReport;
property Items[Index: Integer]: TRMGroupItem read GetItem write SetItem; default;
end;
{ TRMMasterDataBandOptions }
TRMMasterDataBandOptions = class(TPersistent)
private
FLinesPerPage: Integer;
FColumns: Integer;
FColumnWidth: integer;
FColumnGap: integer;
FNewPageAfter: Boolean;
FHeight: Integer;
FReprintColumnHeaderOnNewColumn: Boolean;
public
constructor Create;
procedure Assign(Source: TPersistent); override;
published
property LinesPerPage: Integer read FLinesPerPage write FLinesPerPage default 0;
property Columns: Integer read FColumns write FColumns default 1;
property ColumnWidth: Integer read FColumnWidth write FColumnWidth default 200;
property ColumnGap: Integer read FColumnGap write FColumnGap default 20;
property NewPageAfter: Boolean read FNewPageAfter write FNewPageAfter default False;
property Height: Integer read FHeight write FHeight default -1;
property ReprintColumnHeaderOnNewColumn: Boolean read FReprintColumnHeaderOnNewColumn write FReprintColumnHeaderOnNewColumn default False;
end;
{ TRMGridFontOptions }
TRMGridFontOptions = class(TPersistent)
private
FUseCustomFontSize: Boolean;
FFont: TFont;
procedure SetFont(Value: TFont);
public
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
published
property UseCustomFontSize: Boolean read FUseCustomFontSize write FUseCustomFontSize default False;
property Font: TFont read FFont write SetFont;
end;
TRMPageAggr = class(TPersistent)
private
FAutoTotal: Boolean;
FTotalFields: string;
public
procedure Assign(Source: TPersistent); override;
published
property AutoTotal: Boolean read FAutoTotal write FAutoTotal;
property TotalFields: string read FTotalFields write FTotalFields;
end;
TRMGridPageAggrOptions = class(TPersistent)
private
FPageSum: TRMPageAggr;
FPageSumTotal: TRMPageAggr;
public
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
published
property PageSum: TRMPageAggr read FPageSum write FPageSum;
property PageSumTotal: TRMPageAggr read FPageSumTotal write FPageSumTotal;
end;
TRMReportSettings = class(TPersistent)
private
FShowPrintDialog: Boolean;
FModifyPrepared: Boolean;
FInitialZoom: TRMPreviewZoom;
FPreviewButtons: TRMPreviewButtons;
FPreview: TRMPreview;
FReportTitle: string;
FShowProgress: Boolean;
public
constructor Create;
published
property InitialZoom: TRMPreviewZoom read FInitialZoom write FInitialZoom;
property PreviewButtons: TRMPreviewButtons read FPreviewButtons write FPreviewButtons;
property Preview: TRMPreview read FPreview write FPreview;
property ShowProgress: Boolean read FShowProgress write FShowProgress default True;
property ReportTitle: string read FReportTitle write FReportTitle;
property ShowPrintDialog: Boolean read FShowPrintDialog write FShowPrintDialog default True;
property ModifyPrepared: Boolean read FModifyPrepared write FModifyPrepared default False;
end;
{ TRMCustomGridReport }
TRMCustomGridReport = class(TComponent)
private
FAutoBooleanString: string;
FReport: TRMGridReport;
FRMDataSets: TList;
FGroups: TRMGroupItems;
FReportOptions: TRMGridReportOptions;
FGridFontOptions: TRMGridFontOptions;
FPageLayout: TRMPageLayout;
FPageHeaderMsg: TRMBandMsg;
FPageFooterMsg: TRMBandMsg;
FPageCaptionMsg: TRMPageCaptionMsg;
FGridNumOptions: TRMGridNumOptions;
FMasterDataBandOptions: TRMMasterDataBandOptions;
FReportSettings: TRMReportSettings;
FGridFixedCols: Integer;
FOnAfterCreateGridFieldObject: TRMOnAfterCreateGridObjectEvent;
procedure SetGroups(Value: TRMGroupItems);
function GetReport: TRMGridReport;
procedure SetMasterDataBandOptions(Value: TRMMasterDataBandOptions);
procedure SetGridNumOptions(Value: TRMGridNumOptions);
procedure SetPageLayout(Value: TRMPageLayout);
procedure SetGridFontOptions(Value: TRMGridFontOptions);
procedure SetPageHeaderMsg(Value: TRMBandMsg);
procedure SetPageFooterMsg(Value: TRMBandMsg);
procedure SetPageCaptionMsg(Value: TRMPageCaptionMsg);
procedure ClearRMDataSets;
procedure OnAfterPreviewPageSetup(Sender: TObject);
protected
OffsX, OffsY: Integer;
FormHeight: Integer;
PageWidth, PageHeight: Integer;
HaveDetailBand: Boolean;
function CreateReportFromGrid: Boolean; virtual;
procedure _InternalShowReport(aFlag: Integer);
procedure SetMemoViewFormat(aView: TRMMemoView; aField: TField);
function AddRMDataSet(const aDataSet: TDataSet): TRMDBDataSet;
procedure AssignFont(aView: TRMMemoView; aFont: TFont);
property Groups: TRMGroupItems read FGroups write SetGroups;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure PrintReport;
procedure ShowReport;
procedure DesignReport;
procedure BuildReport;
function PageSetup: Boolean;
function PageHeaderFooterSetup: Boolean;
procedure ChangePageLayout(aPageSetting: TRMPageSetting);
property Report: TRMGridReport read GetReport;
published
property ReportOptions: TRMGridReportOptions read FReportOptions write FReportOptions;
property PageLayout: TRMPageLayout read FPageLayout write SetPageLayout;
property PageHeaderMsg: TRMBandMsg read FPageHeaderMsg write SetPageHeaderMsg;
property PageFooterMsg: TRMBandMsg read FPageFooterMsg write SetPageFooterMsg;
property PageCaptionMsg: TRMPageCaptionMsg read FPageCaptionMsg write SetPageCaptionMsg;
property MasterDataBandOptions: TRMMasterDataBandOptions read FMasterDataBandOptions write SetMasterDataBandOptions;
property GridNumOptions: TRMGridNumOptions read FGridNumOptions write SetGridNumOptions;
property GridFontOptions: TRMGridFontOptions read FGridFontOptions write SetGridFontOptions;
property ReportSettings: TRMReportSettings read FReportSettings write FReportSettings;
property AutoBooleanString: string read FAutoBooleanString write FAutoBooleanString;
property GridFixedCols: Integer read FGridFixedCols write FGridFixedCols default 0;
property OnAfterCreateGridObjectEvent: TRMOnAfterCreateGridObjectEvent read FOnAfterCreateGridFieldObject write FOnAfterCreateGridFieldObject;
end;
{ TRMCustomFormReport }
TRMCustomFormReport = class(TComponent)
private
FAutoBooleanString: string;
FReport: TRMReport;
// FReportDataSet: TRMDBDataSet;
FPageHeader: TRMPageHeaderFooter;
FPageFooter: TRMPageHeaderFooter;
FColumnFooter: TRMPageHeaderFooter;
FDataSet: TDataSet;
FDetailDataSet: TDataSet;
FRMDataSets: TList;
FGroups: TRMGroupItems;
FReportOptions: TRMGridReportOptions;
FGridFontOptions: TRMGridFontOptions;
FPageLayout: TRMPageLayout;
FScaleMode: TRMScaleOptions;
FGridNumOptions: TRMGridNumOptions;
FMasterDataBandOptions: TRMMasterDataBandOptions;
FReportSettings: TRMReportSettings;
procedure SetGroups(Value: TRMGroupItems);
function GetReport: TRMReport;
// function GetReportDataSet: TRMDBDataSet;
procedure SetPageHeader(Value: TRMPageHeaderFooter);
procedure SetPageFooter(Value: TRMPageHeaderFooter);
procedure SetColumnFooter(Value: TRMPageHeaderFooter);
procedure SetMasterDataBandOptions(Value: TRMMasterDataBandOptions);
procedure SetGridNumOptions(Value: TRMGridNumOptions);
procedure SetScaleMode(Value: TRMScaleOptions);
procedure SetPageLayout(Value: TRMPageLayout);
procedure SetGridFontOptions(Value: TRMGridFontOptions);
procedure ClearRMDataSets;
procedure OnAfterPreviewPageSetup(Sender: TObject);
protected
FormWidth: TStringList;
OffsX, OffsY: Integer;
FormHeight: Integer;
PageWidth, PageHeight: Integer;
HaveDetailBand: Boolean;
function CalcWidth(aWidth: Integer): Integer;
procedure AddPage;
procedure CalcRect(t: TRMView; ParentBand: TRMCustomBandView; aFormWidth: Integer);
procedure _InternalShowReport(aFlag: Integer);
procedure SetMemoViewFormat(aView: TRMMemoView; aField: TField);
function AddRMDataSet(const aDataSet: TDataSet): TRMDBDataSet;
function CreateReportFromGrid: Boolean; virtual;
property Groups: TRMGroupItems read FGroups write SetGroups;
property DetailDataSet: TDataSet read FDetailDataSet write FDetailDataSet;
public
MainDataSet: TRMDBDataSet;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure AssignFont(aView: TRMMemoView; aFont: TFont);
procedure PrintReport;
procedure ShowReport;
procedure DesignReport;
procedure BuildReport;
function PageSetup: Boolean;
procedure ChangePageLayout(aPageSetting: TRMPageSetting);
property Report: TRMReport read GetReport;
// property ReportDataSet: TRMDBDataSet read GetReportDataSet;
published
property DataSet: TDataSet read FDataSet write FDataSet;
property ReportOptions: TRMGridReportOptions read FReportOptions write FReportOptions;
property PageLayout: TRMPageLayout read FPageLayout write SetPageLayout;
property PageHeader: TRMPageHeaderFooter read FPageHeader write SetPageHeader;
property PageFooter: TRMPageHeaderFooter read FPageFooter write SetPageFooter;
property ColumnFooter: TRMPageHeaderFooter read FColumnFooter write SetColumnFooter;
property ScaleMode: TRMScaleOptions read FScaleMode write SetScaleMode;
property MasterDataBandOptions: TRMMasterDataBandOptions read FMasterDataBandOptions write SetMasterDataBandOptions;
property GridNumOptions: TRMGridNumOptions read FGridNumOptions write SetGridNumOptions;
property GridFontOptions: TRMGridFontOptions read FGridFontOptions write SetGridFontOptions;
property ReportSettings: TRMReportSettings read FReportSettings write FReportSettings;
property AutoBooleanString: string read FAutoBooleanString write FAutoBooleanString;
end;
{ TRMFormReportObjects }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -