📄 fr_class.pas
字号:
{*****************************************}
{ }
{ FastReport v2.3 }
{ Report classes }
{ }
{ Copyright (c) 1998-99 by Tzyganenko A. }
{ }
{*****************************************}
unit FR_Class;
interface
{$I FR.inc}
uses
SysUtils, Windows, Messages, Classes, Graphics, Printers, Controls,
Forms, StdCtrls, ComCtrls, Dialogs, Menus, Buttons,
FR_View, FR_Pars, FR_Intrp, FR_DSet, FR_DBSet, FR_DBRel
{$IFDEF Delphi6}
, Variants
{$ENDIF}
{$IFDEF IBO}
, IB_Components
{$ELSE}
, DB
{$ENDIF};
const
// object flags
flStretched = 1;
flWordWrap = 2;
flWordBreak = 4;
flAutoSize = 8;
flBandNewPageAfter = 2;
flBandPrintifSubsetEmpty = 4;
flBandPageBreak = 8;
flBandOnFirstPage = $10;
flBandOnLastPage = $20;
flBandRepeatHeader = $40;
flPictCenter = 2;
flPictRatio = 4;
flWantHook = $8000;
// object types
gtMemo = 0;
gtPicture = 1;
gtBand = 2;
gtSubReport = 3;
gtLine = 4;
gtAddIn = 10;
// frame types
frftNone = 0;
frftRight = 1;
frftDown = 2;
frftLeft = 4;
frftUp = 8;
// text align
frtaLeft = 0;
frtaRight = 1;
frtaCenter = 2;
frtaVertical = 4;
frtaMiddle = 8;
frtaDown = 16;
type
TfrDrawMode = (drAll, drCalcHeight, drAfterCalcHeight, drPart);
TfrBandType = (btReportTitle, btReportSummary,
btPageHeader, btPageFooter,
btMasterHeader, btMasterData, btMasterFooter,
btDetailHeader, btDetailData, btDetailFooter,
btSubDetailHeader, btSubDetailData, btSubDetailFooter,
btOverlay, btColumnHeader, btColumnFooter,
btGroupHeader, btGroupFooter,
btCrossHeader, btCrossData, btCrossFooter, btNone);
TfrDataSetPosition = (psLocal, psGlobal);
TfrValueType = (vtNotAssigned, vtDBField, vtOther, vtFRVar);
TfrPageMode = (pmNormal, pmBuildList);
TfrBandRecType = (rtShowBand, rtFirst, rtNext);
TfrRgnType = (rtNormal, rtExtended);
TfrReportType = (rtSimple, rtMultiple);
TfrView = class;
TfrBand = class;
TfrPage = class;
TfrReport = class;
TfrExportFilter = class;
TDetailEvent = procedure(const ParName: String; var ParValue: Variant) of object;
TEnterRectEvent = procedure(Memo: TStringList; View: TfrView) of object;
TBeginDocEvent = procedure of object;
TEndDocEvent = procedure of object;
TBeginPageEvent = procedure(pgNo: Integer) of object;
TEndPageEvent = procedure(pgNo: Integer) of object;
TBeginBandEvent = procedure(Band: TfrBand) of object;
TEndBandEvent = procedure(Band: TfrBand) of object;
TProgressEvent = procedure(n: Integer) of object;
TBeginColumnEvent = procedure(Band: TfrBand) of object;
TPrintColumnEvent = procedure(ColNo: Integer; var Width: Integer) of object;
TManualBuildEvent = procedure(Page: TfrPage) of object;
TfrHighlightAttr = packed record
FontStyle: Word;
FontColor, FillColor: TColor;
end;
TfrPrnInfo = record // print info about page size, margins e.t.c
PPgw, PPgh, Pgw, Pgh: Integer; // page width/height (printer/screen)
POfx, POfy, Ofx, Ofy: Integer; // offset x/y
PPw, PPh, Pw, Ph: Integer; // printable width/height
end;
PfrPageInfo = ^TfrPageInfo;
TfrPageInfo = packed record // pages of a preview
R: TRect;
pgSize: Word;
pgWidth, pgHeight: Integer;
pgOr: TPrinterOrientation;
pgMargins: Boolean;
PrnInfo: TfrPrnInfo;
Visible: Boolean;
Stream: TMemoryStream;
Page: TfrPage;
end;
PfrBandRec = ^TfrBandRec;
TfrBandRec = packed record
Band: TfrBand;
Action: TfrBandRecType;
end;
TfrView = class(TObject)
private
procedure P1Click(Sender: TObject);
protected
SaveX, SaveY, SaveDX, SaveDY: Integer;
SaveFW: Single;
BaseName: String;
Canvas: TCanvas;
DRect: TRect;
gapx, gapy: Integer;
Memo1: TStringList;
FDataSet: TfrTDataSet;
FField: String;
olddy: Integer;
StreamMode: (smDesigning, smPrinting);
procedure ShowBackGround; virtual;
procedure ShowFrame; virtual;
procedure BeginDraw(ACanvas: TCanvas);
procedure GetBlob(b: TfrTField); virtual;
procedure OnHook(View: TfrView); virtual;
public
Parent: TfrBand;
Name: String;
ID: Integer;
Typ: Byte;
Selected: Boolean;
OriginalRect: TRect;
ScaleX, ScaleY: Double; // used for scaling objects in preview
OffsX, OffsY: Integer; //
IsPrinting: Boolean;
x, y, dx, dy: Integer;
Flags: Word;
FrameTyp: Word;
FrameWidth: Single;
FrameColor: TColor;
FrameStyle: Word;
FillColor: TColor;
Format: Integer;
FormatStr: String;
Visible: WordBool;
Memo, Script: TStringList;
constructor Create; virtual;
destructor Destroy; override;
procedure Assign(From: TfrView); virtual;
procedure CalcGaps; virtual;
procedure RestoreCoord; virtual;
procedure Draw(Canvas: TCanvas); virtual; abstract;
procedure Print(Stream: TStream); virtual;
procedure ExportData; virtual;
procedure LoadFromStream(Stream: TStream); virtual;
procedure SaveToStream(Stream: TStream); virtual;
procedure SaveToFR3Stream(Stream: TStream); virtual;
procedure Resized; virtual;
procedure DefinePopupMenu(Popup: TPopupMenu); virtual;
function GetClipRgn(rt: TfrRgnType): HRGN; virtual;
procedure CreateUniqueName;
procedure SetBounds(Left, Top, Width, Height: Integer);
end;
TfrStretcheable = class(TfrView)
protected
ActualHeight: Integer;
DrawMode: TfrDrawMode;
function CalcHeight: Integer; virtual; abstract;
function MinHeight: Integer; virtual; abstract;
function RemainHeight: Integer; virtual; abstract;
end;
TfrMemoView = class(TfrStretcheable)
private
FFont: TFont;
procedure P1Click(Sender: TObject);
procedure P2Click(Sender: TObject);
procedure P3Click(Sender: TObject);
procedure P4Click(Sender: TObject);
procedure P5Click(Sender: TObject);
procedure SetFont(Value: TFont);
protected
Streaming: Boolean;
TextHeight: Integer;
CurStrNo: Integer;
Exporting: Boolean;
procedure ExpandVariables;
procedure AssignFont(Canvas: TCanvas);
procedure WrapMemo;
procedure ShowMemo;
function CalcWidth(Memo: TStringList): Integer;
function CalcHeight: Integer; override;
function MinHeight: Integer; override;
function RemainHeight: Integer; override;
procedure GetBlob(b: TfrTField); override;
public
Adjust: Integer;
Highlight: TfrHighlightAttr;
HighlightStr: String;
LineSpacing, CharacterSpacing: Integer;
constructor Create; override;
destructor Destroy; override;
procedure Assign(From: TfrView); override;
procedure Draw(Canvas: TCanvas); override;
procedure Print(Stream: TStream); override;
procedure ExportData; override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure SaveToFR3Stream(Stream: TStream); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
property Font: TFont read FFont write SetFont;
end;
TfrBandView = class(TfrView)
private
procedure P1Click(Sender: TObject);
procedure P2Click(Sender: TObject);
procedure P3Click(Sender: TObject);
procedure P4Click(Sender: TObject);
procedure P5Click(Sender: TObject);
procedure P6Click(Sender: TObject);
function GetBandType: TfrBandType;
procedure SetBandType(const Value: TfrBandType);
public
constructor Create; override;
procedure Draw(Canvas: TCanvas); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
function GetClipRgn(rt: TfrRgnType): HRGN; override;
procedure SaveToFR3Stream(Stream: TStream); override;
property BandType: TfrBandType read GetBandType write SetBandType;
property DataSet: String read FormatStr write FormatStr;
property GroupCondition: String read FormatStr write FormatStr;
end;
TfrSubReportView = class(TfrView)
public
SubPage: Integer;
constructor Create; override;
procedure Assign(From: TfrView); override;
procedure Draw(Canvas: TCanvas); override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure SaveToFR3Stream(Stream: TStream); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
end;
TfrPictureView = class(TfrView)
private
procedure P1Click(Sender: TObject);
procedure P2Click(Sender: TObject);
protected
procedure GetBlob(b: TfrTField); override;
public
Picture: TPicture;
constructor Create; override;
destructor Destroy; override;
procedure Assign(From: TfrView); override;
procedure Draw(Canvas: TCanvas); override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure SaveToFR3Stream(Stream: TStream); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
end;
TfrLineView = class(TfrView)
public
constructor Create; override;
procedure Draw(Canvas: TCanvas); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
function GetClipRgn(rt: TfrRgnType): HRGN; override;
procedure SaveToFR3Stream(Stream: TStream); override;
end;
TfrBand = class(TObject)
private
Parent: TfrPage;
View: TfrView;
Flags: Word;
Next, Prev: TfrBand;
SubIndex, MaxY: Integer;
EOFReached: Boolean;
EOFArr: Array[0..31] of Boolean;
Positions: Array[TfrDatasetPosition] of Integer;
LastGroupValue: Variant;
HeaderBand, FooterBand, LastBand: TfrBand;
Values: TStringList;
Count: Integer;
DisableInit: Boolean;
CalculatedHeight: Integer;
procedure InitDataSet(Desc: String);
procedure DoError;
function CalcHeight: Integer;
procedure StretchObjects(MaxHeight: Integer);
procedure UnStretchObjects;
procedure DrawObject(t: TfrView);
procedure PrepareSubReports;
procedure DoSubReports;
function DrawObjects: Boolean;
procedure DrawCrossCell(Parnt: TfrBand; CurX: Integer);
procedure DrawCross;
function CheckPageBreak(y, dy: Integer; PBreak: Boolean): Boolean;
procedure DrawPageBreak;
function HasCross: Boolean;
function DoCalcHeight: Integer;
procedure DoDraw;
function Draw: Boolean;
procedure InitValues;
procedure DoAggregate;
public
x, y, dx, dy, maxdy: Integer;
Typ: TfrBandType;
PrintIfSubsetEmpty, NewPageAfter, Stretched, PageBreak, Visible: Boolean;
Objects: TList;
Memo, Script: TStringList;
DataSet: TfrDataSet;
IsVirtualDS: Boolean;
VCDataSet: TfrDataSet;
IsVirtualVCDS: Boolean;
GroupCondition: String;
ForceNewPage, ForceNewColumn: Boolean;
constructor Create(ATyp: TfrBandType; AParent: TfrPage);
destructor Destroy; override;
end;
TfrValue = class
public
Typ: TfrValueType;
OtherKind: Integer; // for vtOther - typ, for vtDBField - format
DataSet: String; // for vtDBField
Field: String; // here is an expression for vtOther
DSet: TfrTDataSet;
end;
TfrValues = class(TPersistent)
private
FItems: TStringList;
function GetValue(Index: Integer): TfrValue;
public
constructor Create; virtual;
destructor Destroy; override;
function AddValue: Integer;
function FindVariable(const s: String): TfrValue;
procedure ReadBinaryData(Stream: TStream);
procedure WriteBinaryData(Stream: TStream);
procedure Clear;
property Items: TStringList read FItems write FItems;
property Objects[Index: Integer]: TfrValue read GetValue;
end;
TfrPage = class(TObject)
private
Bands: Array[TfrBandType] of TfrBand;
Skip, InitFlag: Boolean;
CurColumn, LastStaticColumnY, XAdjust: Integer;
List: TList;
Mode: TfrPageMode;
PlayFrom: Integer;
LastBand: TfrBand;
ColPos, CurPos: Integer;
procedure InitReport;
procedure DoneReport;
procedure TossObjects;
procedure PrepareObjects;
procedure FormPage;
procedure DoAggregate(a: Array of TfrBandType);
procedure AddRecord(b: TfrBand; rt: TfrBandRecType);
procedure ClearRecList;
function PlayRecList: Boolean;
procedure DrawPageFooters;
function BandExists(b: TfrBand): Boolean;
procedure AfterPrint;
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
procedure ShowBand(b: TfrBand);
public
pgSize, pgWidth, pgHeight: Integer;
pgMargins: TRect;
pgOr: TPrinterOrientation;
PrintToPrevPage, UseMargins: WordBool;
PrnInfo: TfrPrnInfo;
ColCount, ColWidth, ColGap: Integer;
Objects, RTObjects: TList;
CurY, CurBottomY: Integer;
constructor Create(ASize, AWidth, AHeight: Integer; AOr: TPrinterOrientation);
destructor Destroy; override;
function TopMargin: Integer;
function BottomMargin: Integer;
function LeftMargin: Integer;
function RightMargin: Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -