rm_class.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,744 行 · 第 1/5 页

PAS
1,744
字号
{*****************************************}
{                                         }
{              Report Machine             }
{             Report classes              }
{                                         }
{*****************************************}

unit RM_Class;

{$I RM.INC}
{$R RM_LNG1.RES}

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, TypInfo,
  Forms, StdCtrls, Dialogs, IniFiles, Registry, DB, RM_Ctrls,
  RM_Const, RM_Const1, RM_Dataset, RM_Progr, RM_Printer, RM_Common,
  RM_AutoSearchField, RM_Parser, rm_ZlibEx
  {$IFDEF USE_INTERNAL_JVCL}
  , rm_JvInterpreter, rm_JvInterpreterParser, rm_JvInterpreterFm
  {$ELSE}
  , JvInterpreter, JvInterpreterParser, JvInterpreterFm
  {$ENDIF}
  {$IFDEF TntUnicode}, TntSysUtils{$ENDIF}
  {$IFDEF Delphi6}, Variants{$ENDIF};

const
  rmgtMemo = 0;
  rmgtPicture = 1;
  rmgtSubReport = 2;
  //  rmgtLine = 3;
  rmgtCalcMemo = 4;
  rmgtBand = 5;
  rmgtShape = 6;
  rmgtOutline = 7;
  rmgtAddIn = 100;

type

  TRMPrintMethodType = (rmptMetafile, rmptBitmap);
  TRMPictureSource = (rmpsPicture, rmpsFileName);
  TRMReportStatus = (rmrsReady, rmrsBusy, rmrsFinished);
  TRMCompressionLevel = (rmzcNone, rmzcFastest, rmzcDefault, rmzcMax);

  TRMDocMode = (rmdmDesigning, rmdmPrinting, rmdmPreviewing, rmdmNone);
  TRMHAlign = (rmhLeft, rmhCenter, rmhRight, rmhEuqal);
  TRMVAlign = (rmvTop, rmvCenter, rmvBottom);
  TRMDrawMode = (rmdmAll, rmdmAfterCalcHeight, rmdmPart);
  TRMPrintPages = (rmppAll, rmppOdd, rmppEven);
  TRMColumnDirectionType = (rmcdTopBottomLeftRight, rmcdLeftRightTopBottom);
  TRMDBCalcType = (rmdcSum, rmdcCount, rmdcAvg, rmdcMax, rmdcMin, rmdcUser);
  TRMRotationType = (rmrtNone, rmrt90, rmrt180, rmrt270, rmrt360);
  TRMScaleFontType = (rmstNone, rmstByWidth, rmstByHeight);
  TRMCompositeMode = (rmReportPerReport, rmPagePerPage);
  TRMReportType = (rmrtSimple, rmrtMultiple);
  TRMStreamMode = (rmsmDesigning, rmsmPrinting);
  TRMDataSetPosition = (rmpsLocal, rmpsGlobal);
  TRMRestriction = (rmrtDontModify, rmrtDontSize, rmrtDontMove, rmrtDontDelete, rmrtDontEditMemo);
  TRMRestrictions = set of TRMRestriction;
  TRMBandAlign = (rmbaNone, rmbaLeft, rmbaRight, rmbaBottom, rmbaTop, rmbaCenter);
  TRMShiftMode = (rmsmAlways, rmsmNever, rmsmWhenOverlapped);
  TRMRgnType = (rmrtNormal, rmrtExtended);
  TRMSubReportType = (rmstFixed, rmstChild);
  TRMShapeType = (rmskRectangle, rmskRoundRectangle, rmskEllipse, rmskTriangle,
    rmskDiagonal1, rmskDiagonal2, rmskSquare, rmskRoundSquare, rmskCircle, rmHorLine,
    rmRightAndLeft, rmTopAndBottom, rmVertLine);

  TRMBandRecType = (rmrtShowBand, rmrtFirst, rmrtNext);
  TRMBandType = (rmbtReportTitle, rmbtReportSummary,
    rmbtPageHeader, rmbtPageFooter,
    rmbtHeader, rmbtFooter,
    rmbtMasterData, rmbtDetailData,
    rmbtOverlay, rmbtColumnHeader, rmbtColumnFooter,
    rmbtGroupHeader, rmbtGroupFooter,
    rmbtCrossHeader, rmbtCrossData, rmbtCrossFooter, rmbtChild, rmbtNone);
  TRMDesignerRestriction =
    (rmdrDontEditObj, rmdrDontModifyObj, rmdrDontSizeObj, rmdrDontMoveObj,
    rmdrDontDeleteObj, rmdrDontCreateObj,
    rmdrDontDeletePage, rmdrDontCreatePage, rmdrDontEditPage,
    rmdrDontCreateReport, rmdrDontLoadReport, rmdrDontSaveReport,
    rmdrDontPreviewReport, rmdrDontEditVariables, rmdrDontChangeReportOptions, rmdtDontEditScript);
  TRMDesignerRestrictions = set of TRMDesignerRestriction;

  TRMView = class;
  TRMReportView = class;
  TRMBand = class;
  TRMCustomPage = class;
  TRMReportPage = class;
  TRMPages = class;
  TRMReport = class;
  TRMReportDesigner = class;
  TRMEndPage = class;
  TRMEndPages = class;

  TRMGetValueEvent = procedure(const ParName: string; var ParValue: Variant) of object;
  TRMLoadSaveReportSettingEvent = procedure(aReport: TRMReport) of object;
  TRMProgressEvent = procedure(n: Integer) of object;
  TRMBeginPageEvent = procedure(PageNo: Integer) of object;
  TRMEndPageEvent = procedure(PageNo: Integer) of object;
  TRMAfterPrintEvent = procedure(const View: TRMReportView) of object;
  TRMOnBeforePrintEvent = procedure(Memo: TStrings; View: TRMReportView) of object;
  TRMBeginBandEvent = procedure(aBand: TRMBand) of object;
  TRMEndBandEvent = procedure(aBand: TRMBand) of object;
  TRMManualBuildEvent = procedure(aPage: TRMReportPage) of object;
  TRMBeginColumnEvent = procedure(aBand: TRMBand) of object;
  TRMPrintColumnEvent = procedure(ColNo: Integer; var Width: Integer) of object;
  TRMBeforePrintBandEvent = procedure(aBand: TRMBand; var PrintBand: Boolean) of object;
  TRMEndPrintPageEvent = procedure(var aPageNo: Integer) of object;
  TRMReadOneEndPageEvent = procedure(const aPageNo, aTotalPages: Integer) of object;

  TRMPreviewClickEvent = procedure(Sender: TRMReportView; Button: TMouseButton;
    Shift: TShiftState; var Modified: Boolean) of object;

  TRMBeforeExportEvent = procedure(var aFileName: string; var aContinue: Boolean) of object;
  TRMAfterExportEvent = procedure(const aFileName: string) of object;

  PRMCacheItem = ^TRMCacheItem;
  TRMCacheItem = record
    DataSet: TRMDataSet;
    DataFieldName: string;
  end;

  { TRMHighlight }
  TRMHighlight = class(TPersistent)
  private
    FColor: TColor;
    FFont: TFont;
    FCondition: string;
    procedure SetFont(Value: TFont);
    procedure SetColor(Value: TColor);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    property Color: TColor read FColor write SetColor;
    property Condition: string read FCondition write FCondition;
    property Font: TFont read FFont write SetFont;
  end;

  { TRMFrameLine }
  TRMFrameLine = class(TPersistent)
  private
    FVisible: Boolean;
    FStyle: TPenStyle;
    FColor: TColor;
    FmmWidth: Integer;
    FParentView: TRMView;
    FDoubleFrame: Boolean;

    function GetWidth: Double;
    procedure SetWidth(Value: Double);
    function GetspWidth: Integer;
    procedure SetspWidth(Value: Integer);
    procedure SetColor(Value: TColor);
  public
    constructor Create(aParentView: TRMView);
    procedure Assign(Source: TPersistent); override;
    function GetUnits: TRMUnitType;

    property mmWidth: Integer read FmmWidth write FmmWidth;
    property spWidth: Integer read GetspWidth write SetspWidth;
  published
    property Visible: Boolean read FVisible write FVisible;
    property Style: TPenStyle read FStyle write FStyle;
    property Color: TColor read FColor write SetColor;
    property Width: Double read GetWidth write SetWidth;
    property DoubleFrame: Boolean read FDoubleFrame write FDoubleFrame;
  end;

  { TRMView }
  TRMView = class(TRMCustomView)
  private
    FParentFont: Boolean;
    FIsBand, FIsCrossBand: Boolean;
    FParentPage: TRMCustomPage;
    FParentReport: TRMReport;
    FmmLeft, FmmTop, FmmWidth, FmmHeight: Integer;
    FmmGapLeft, FmmGapTop: Integer;
    FVisible: Boolean;
    FMemo, FMemo1: TStrings;
    FRestrictions: TRMRestrictions;
    FIsStringValue: Boolean;
    FLeftFrame: TRMFrameLine;
    FTopFrame: TRMFrameLine;
    FRightFrame: TRMFrameLine;
    FBottomFrame: TRMFrameLine;
    FLeftRightFrame: Word;
    FFillColor: TColor;
    FBrushStyle: TBrushStyle;
    FTag: Integer;
    FTagStr: string;
    FUrl: string;
    FFlowTo: string;
    FStyle: string;
    FCursor: TCursor;
    FExpressionDelimiters: string;

    function GetProp(Index: string): Variant;
    procedure SetProp(Index: string; Value: Variant);
    function GetLeft(Index: Integer): Double;
    procedure SetLeft(Index: Integer; Value: Double);
    function GetspLeft(Index: Integer): Integer;
    procedure SetspLeft(Index: Integer; Value: Integer);
    function GetspLeft_Designer(Index: Integer): Integer;
    procedure SetspLeft_Designer(Index: Integer; Value: Integer);

    procedure SetFillColor(Value: TColor);
    procedure SetMemo(Value: TStrings);
    procedure SetMemo1(Value: TStrings);
    function GetWantHook: Boolean;
    procedure SetWantHook(const value: Boolean);
    function GetStretched: Boolean;
    procedure SetStretched(const value: Boolean);
    function GetStretchedMax: Boolean;
    procedure SetStretchedMax(const value: Boolean);
    function GetTransparent: Boolean;
    procedure SetTransparent(value: Boolean);
    function GetHideZeros: Boolean;
    procedure SetHideZeros(Value: Boolean);
    function GetDontUndo: Boolean;
    procedure SetDontUndo(Value: Boolean);
    function GetOnePerPage: Boolean;
    procedure SetOnePerPage(Value: Boolean);
    function GetIsChildView: Boolean;
    procedure SetIsChildView(Value: Boolean);
    function GetUseDoublePass: Boolean;
    procedure SetUseDoublePass(Value: Boolean);
    procedure SetParentFont(Value: Boolean);
    procedure SetStyle(Value: string);
    procedure SetFlowTo(Value: string);
    procedure SetTagStr(Value: string);
    procedure SetUrl(Value: string);
  protected
    Typ: Byte; // 对象类型
    BaseName: string;
    Canvas: TCanvas;
    StreamMode: TRMStreamMode;
    FFlags: LongWord;
    ParentBand: TRMBand;
    FDataSet: TRMDataset;
    FDataFieldName: string;
    IsBlobField: Boolean;
    FNeedWrapped: Boolean;
    ObjectID: Integer;
    IsPrinting: Boolean;
    FComponent: TComponent;

    mmSaveGapX, mmSaveGapY: Integer;
    mmSaveLeft, mmSaveTop, mmSaveWidth, mmSaveHeight: Integer;
    mmSaveFWLeft, mmSaveFWTop, mmSaveFWRight, mmSaveFWBottom: Integer;
    mmSaveFontWidth: Integer;
    SaveFontWidth: Integer;
    RealRect: TRect;
    OriginalRect: TRect;

    FactorX, FactorY: Double; // used for scaling objects in preview
    OffsetLeft, OffsetTop: Integer; //

    procedure SetPropertyValue(aPropName: string; aValue: Variant);
    procedure ClearContents; virtual;
    procedure SetName(const Value: string); override;
    procedure InternalOnGetValue(aView: TRMReportView; aParName: string; var aParValue: string; aUnicode: Boolean);
    procedure InternalOnBeforePrint(Memo: TStrings; View: TRMReportView);
    function _CalcVFrameWidth(aTopWidth, aBottomWidth: Double): Integer;
    function _CalcHFrameWidth(aLeftWidth, aRightWidth: Double): Integer;
    function _DrawRect: TRect;
    function GetPrinter: TRMPrinter;
    procedure AfterChangeName; virtual;
    function DocMode: TRMDocMode;
    procedure OnHook(View: TRMView); virtual;
    procedure Loaded; virtual;
    procedure CalcGaps; virtual;
    procedure RestoreCoord; virtual;
    procedure ShowBackGround; virtual;
    procedure Prepare; virtual;
    procedure UnPrepare; virtual;
    function GetViewCommon: string; virtual;
    function GetParentBand: TRMBand;
    procedure SetParentPage(Value: TRMCustomPage); virtual;
    function IsCrossView: Boolean; virtual;
    function IsContainer: Boolean; virtual;

    function GetPropValue(aObject: TObject; aPropName: string; var aValue: Variant;
      Args: array of Variant): Boolean; override;
    function SetPropValue(aObject: TObject; aPropName: string; aValue: Variant): Boolean; override;

    property Tag: Integer read FTag write FTag;
    property TagStr: string read FTagStr write SetTagStr;
    property Url: string read FUrl write SetUrl;
    property FlowTo: string read FFlowTo write SetFlowTo;
    property Style: string read FStyle write SetStyle;
    property BrushStyle: TBrushStyle read FBrushStyle write FBrushStyle;
    property ParentFont: Boolean read FParentFont write SetParentFont;
    property ParentReport: TRMReport read FParentReport write FParentReport;
    property WantHook: Boolean read GetWantHook write SetWantHook;
    property Stretched: Boolean read GetStretched write SetStretched;
    property StretchedMax: Boolean read GetStretchedMax write SetStretchedMax;
    property Transparent: Boolean read GetTransparent write SetTransparent;
    property HideZeros: Boolean read GetHideZeros write SetHideZeros;
    property Visible: Boolean read FVisible write FVisible;
    property Left: Double index 0 read GetLeft write SetLeft;
    property Top: Double index 1 read GetLeft write SetLeft;
    property Width: Double index 2 read GetLeft write SetLeft;
    property Height: Double index 3 read GetLeft write SetLeft;
    property Cursor: TCursor read FCursor write FCursor;
    property ExpressionDelimiters: string read FExpressionDelimiters write FExpressionDelimiters;

    property mmGapLeft: Integer read FmmGapLeft;
    property mmGapTop: integer read FmmGapTop;
    property mmLeft: Integer read FmmLeft;
    property mmTop: Integer read FmmTop;
    property mmWidth: Integer read FmmWidth;
    property mmHeight: Integer read FmmHeight;
    property DontUndo: Boolean read GetDontUndo write SetDontUndo;
    property OnePerPage: Boolean read GetOnePerPage write SetOnePerPage;
    property IsChildView: Boolean read GetIsChildView write SetIsChildView;
    property UseDoublePass: Boolean read GetUseDoublePass write SetUseDoublePass;
  public
    Selected: Boolean; // used in designer
    NeedCreateName: Boolean;

    constructor Create; override;
    destructor Destroy; override;
    procedure Assign(aSource: TPersistent); override;
    procedure ShowEditor; virtual;
    procedure DefinePopupMenu(aPopup: TRMCustomMenuItem); virtual;

    function GetClipRgn(rt: TRMRgnType): HRGN; virtual;
    function GetUnits: TRMUnitType;
    procedure CreateName(aReport: TRMReport);
    procedure SetBounds(aLeft, aTop, aWidth, aHeight: Double);
    procedure SetspBounds(aLeft, aTop, aWidth, aHeight: Integer);
    procedure LoadFromStream(aStream: TStream); virtual; abstract;
    procedure SaveToStream(aStream: TStream); virtual; abstract;
    procedure Draw(aCanvas: TCanvas); virtual; abstract;
    procedure SetFrameVisible(aVisible: Boolean);

    property Prop[Index: string]: Variant read GetProp write SetProp; default;
    property IsBand: Boolean read FIsBand;
    property IsCrossBand: Boolean read FIsCrossBand;
    property ParentPage: TRMCustomPage read FParentPage write SetParentPage;

    property spLeft_Designer: Integer index 0 read GetspLeft_Designer write SetspLeft_Designer;
    property spTop_Designer: Integer index 1 read GetspLeft_Designer write SetspLeft_Designer;
    property spWidth_Designer: Integer index 2 read GetspLeft_Designer write SetspLeft_Designer;
    property spHeight_Designer: Integer index 3 read GetspLeft_Designer write SetspLeft_Designer;
    property spRight_Designer: Integer index 4 read GetspLeft_Designer;

⌨️ 快捷键说明

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