rm_formreport.pas

来自「report machine 2.3 功能强大」· PAS 代码 · 共 1,965 行 · 第 1/5 页

PAS
1,965
字号
unit RM_FormReport;

{$I RM.INC}

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Printers, Controls, DB,
  Forms, StdCtrls, ExtCtrls, ComCtrls, Dialogs, Menus, Buttons, Grids, DBCtrls,
  DBGrids, RM_const, RM_DBRel, RM_DSet, RM_DBSet, RM_Class, RM_view, RM_prntr;

type
  TRMGridReportOption = (rmgoUseColor, rmgoStretch, rmgoWordWrap, rmgoGridLines,
    rmgoSelectedRecordsOnly, rmgoAppendBlank, rmgoGridNumber, rmgoDrawBorder,
    rmgoDoubleFrame, rmgoRebuildAfterPageChanged);
  TRMGridReportOptions = set of TRMGridReportOption;
  TRMFRScaleMode = (rmsmAdjust, rmsmFit);
  TRMCustomGridReport = class;
  TRMFormReport = class;

  TRMOnPrintObjectEvent = procedure(aFormReport: TRMFormReport; aPage: TRMPage;
    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
    FPageSize: Word;
    FLeftMargin: integer;
    FTopMargin: integer;
    FBottomMargin: integer;
    FRightMargin: integer;
    FColumns: integer;
    FColumnSpace: integer;
    FPageHeight: integer;
    FPageWidth: integer;
    FPageOr: TPrinterOrientation;
    FPageBin: integer;
    FPrintToDefault: Boolean;
    FPrinterName: string;
    FDoublePass: Boolean;
    FScaleFrameWidth: Boolean;
  protected
  public
    constructor Create;
    procedure Assign(Source: TPersistent); override;
  published
    property pgSize: 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 Columns: integer read FColumns write FColumns default 0;
    property ColumnSpace: integer read FColumnSpace write FColumnSpace default 0;
    property Height: integer read FPageHeight write FPageHeight default 2100;
    property Width: integer read FPageWidth write FPageWidth default 2970;
    property pgOr: TPrinterOrientation read FPageOr write FPageOr default poPortrait;
    property pgBin: integer read FPageBin write FPageBin;
    property PrintToDefault: Boolean read FPrintToDefault write FPrintToDefault default True;
    property PrinterName: string read FPrinterName write FPrinterName;
    property DoublePass: Boolean read FDoublePass write FDoublePass default False;
    property ScaleFrameWidth: Boolean read FScaleFrameWidth write FScaleFrameWidth;
  end;

  { TRMPageHeaderFooter }
  TRMPageHeaderFooter = class(TPersistent)
  private
    FCaption: TStrings;
    FHeight: Integer;
    procedure SetCaption(Value: TStrings);
    procedure SetHeight(Value: Integer);
  protected
    ParentFormReport: TRMCustomGridReport;
    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);
  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: TRMCustomGridReport;
  protected
  public
    constructor Create(Collection: TCollection); override;
    procedure Assign(Source: TPersistent); override;
    property Report: TRMCustomGridReport 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: TRMCustomGridReport;
    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: TRMCustomGridReport);
    function Add: TRMGroupItem;
    property Report: TRMCustomGridReport 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;
  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;
  end;

  { TRMGridFontOptions }
  TRMGridFontOptions = class(TPersistent)
  private
    FUseMaualFont: Boolean;
    FFont: TFont;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    property UseMaualFont: Boolean read FUseMaualFont write FUseMaualFont default False;
    property Font: TFont read FFont write FFont;
  end;

  { TRMCustomGridReport }
  TRMCustomGridReport = class(TComponent)
  private
    FReport: TRMReport;
    FReportDataSet: TRMDBDataSet;
    FPageHeader: TRMPageHeaderFooter;
    FPageFooter: TRMPageHeaderFooter;
    FDataSet: TDataSet;
    FDataSource: TDataSource;

    FGroups: TRMGroupItems;
    FReportOptions: TRMGridReportOptions;
    FGridFontOptions: TRMGridFontOptions;
    FPageLayout: TRMPageLayout;
    FScaleMode: TRMScaleOptions;
    FGridNumOptions: TRMGridNumOptions;
    FMasterDataBandOptions: TRMMasterDataBandOptions;

    FInitialZoom: TRMPreviewZoom;
    FPreviewButtons: TRMPreviewButtons;
    FPreview: TRMPreview;
    FReportType: TRMReportType;
    FReportTitle: string;
    FShowProgress: Boolean;
    FOnBeginDoc: TRMBeginDocEvent;
    FOnEndDoc: TRMEndDocEvent;
    FOnBeginBand: TRMBeginBandEvent;
    FOnEndBand: TRMEndBandEvent;
    FOnBeginPage: TRMBeginPageEvent;
    FOnEndPage: TRMEndPageEvent;
    FOnGetValue: TRMDetailEvent;
    FOnProgress: TRMProgressEvent;
    FOnBeginColumn: TRMBeginColumnEvent;
    FOnPrintColumn: TRMPrintColumnEvent;

    procedure SetGroups(Value: TRMGroupItems);
    function GetReport: TRMReport;
    function GetReportDataSet: TRMDBDataSet;

    procedure SetPageHeader(Value: TRMPageHeaderFooter);
    procedure SetPageFooter(Value: TRMPageHeaderFooter);
    procedure SetMasterDataBandOptions(Value: TRMMasterDataBandOptions);
    procedure SetGridNumOptions(Value: TRMGridNumOptions);
    procedure SetScaleMode(Value: TRMScaleOptions);
    procedure SetPageLayout(Value: TRMPageLayout);
//    procedure SetGridFontOptions(Value: TRMGridFontOptions);

    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: TRMBandView; aFormWidth: Integer);
    procedure ShowReport(aFlag: Integer);
    procedure SetMemoViewFormat(aView: TRMMemoView; aField: TField);
    property Groups: TRMGroupItems read FGroups write SetGroups;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    function CreateReportFromGrid: Boolean; virtual;
    procedure AssignFont(aView: TRMMemoView; aFont: TFont);
    procedure PrintReport;
    procedure PreviewReport;
    procedure DesignReport;
    procedure BuildReport;
    procedure ChangePageLayout(aPageSetting: TRMPageSetting);
    property Report: TRMReport read GetReport;
    property ReportDataSet: TRMDBDataSet read GetReportDataSet;
  published
    property DataSet: TDataSet read FDataSet write FDataSet;
    property DataSource: TDataSource read FDataSource write FDataSource;
    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 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 InitialZoom: TRMPreviewZoom read FInitialZoom write FInitialZoom;
    property PreviewButtons: TRMPreviewButtons read FPreviewButtons write FPreviewButtons;
    property Preview: TRMPreview read FPreview write FPreview;
    property ReportType: TRMReportType read FReportType write FReportType default rtSimple;
    property ShowProgress: Boolean read FShowProgress write FShowProgress default True;
    property ReportTitle: string read FReportTitle write FReportTitle;

    property OnBeginBand: TRMBeginBandEvent read FOnBeginBand write FOnBeginBand;
    property OnEndBand: TRMEndBandEvent read FOnEndBand write FOnEndBand;
    property OnBeginDoc: TRMBeginDocEvent read FOnBeginDoc write FOnBeginDoc;
    property OnEndDoc: TRMEndDocEvent read FOnEndDoc write FOnEndDoc;
    property OnBeginPage: TRMBeginPageEvent read FOnBeginPage write FOnBeginPage;
    property OnEndPage: TRMEndPageEvent read FOnEndPage write FOnEndPage;
    property OnGetValue: TRMDetailEvent read FOnGetValue write FOnGetValue;
    property OnProgress: TRMProgressEvent read FOnProgress write FOnProgress;
    property OnBeginColumn: TRMBeginColumnEvent read FOnBeginColumn write FOnBeginColumn;
    property OnPrintColumn: TRMPrintColumnEvent read FOnPrintColumn write FOnPrintColumn;
  end;

  { TRMFormReportObjects }
  TRMFormReportObject = class(TObject)
  private
    FAutoFree: Boolean;
  public
    constructor CreateObject; virtual;
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); virtual; abstract;
    property AutoFree: Boolean read FAutoFree write FAutoFree;
  end;

 { TRMAddInFormReportObjectInfo }
  TRMAddInFormReportObjectInfo = class
  private
    FClassRef: TClass;
    FObjectClass: TClass;
  public
    constructor Create(AClassRef: TClass; AObjectClass: TClass);
    property ClassRef: TClass read FClassRef;
    property ObjectClass: TClass read FObjectClass;
  end;

  { TRMFormReport }
  TRMFormReport = class(TRMCustomGridReport)
  private
    FGridFixedCols: Integer;
    FDrawOnPageFooter: Boolean;
    FPageHeaderViews, FPageDetailViews, FPageFooterViews: TList;
    FColumnFooterViews: TList;
    FGroupFooterViews: TList;
    FGridTop, FGridHeight: Integer;
    FPrintControl: TWinControl;
    FReportObjects: TList;
    FOnPrintObject: TRMOnPrintObjectEvent;
    FOnAfterCreateObject: TRMOnAfterCreateObjectEvent;
    FOnAfterCreateGridFieldObject: TRMOnAfterCreateGridObjectEvent;
    procedure Clear;
  protected
    CanSetDataSet: Boolean;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    function CreateReportFromGrid: Boolean; override;

    property PageHeaderViews: TList read FPageHeaderViews;
    property PageDetailViews: TList read FPageDetailViews;
    property PageFooterViews: TList read FPageFooterViews;
    property ColumnFooterViews: TList read FColumnFooterViews;
    property GroupFooterViews: TList read FGroupFooterViews;
    property GridTop: Integer read FGridTop write FGridTop;
    property GridHeight: Integer read FGridHeight write FGridHeight;
    property DrawOnPageFooter: Boolean read FDrawOnPageFooter write FDrawOnPageFooter;
  published
    property Groups;
    property PrintControl: TWinControl read FPrintControl write FPrintControl;
    property GridFixedCols: Integer read FGridFixedCols write FGridFixedCols default 0;
    property OnPrintObject: TRMOnPrintObjectEvent read FOnPrintObject write FOnPrintObject;
    property OnAfterCreateObject: TRMOnAfterCreateObjectEvent read FOnAfterCreateObject write FOnAfterCreateObject;
    property OnAfterCreateGridObjectEvent: TRMOnAfterCreateGridObjectEvent read FOnAfterCreateGridFieldObject write FOnAfterCreateGridFieldObject;
  end;

  { TRMPrintRichEdit }
  TRMPrintRichEdit = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); override;
  end;

 { TRMPrintControl }
  TRMPrintControl = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); override;
  end;

 { TRMPrintEdit }
  TRMPrintEdit = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); override;
  end;

 { TRMPrintImage }
  TRMPrintImage = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); override;
  end;

 { TRMPrintShape }
  TRMPrintShape = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;
      Control: TControl; var t: TRMView); override;
  end;

 { TRMPrintCheckBox }
  TRMPrintCheckBox = class(TRMFormReportObject)
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; Page: TRMPage;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?