📄 fr_class.pas
字号:
procedure Clear;
procedure Delete(Index: Integer);
function FindObjectByID(ID: Integer): Integer;
function FindObject(Name: String): TfrView;
function FindRTObject(Name: String): TfrView;
procedure ChangePaper(ASize, AWidth, AHeight: Integer; AOr: TPrinterOrientation);
procedure ShowBandByName(s: String);
procedure ShowBandByType(bt: TfrBandType);
procedure NewPage;
procedure NewColumn(Band: TfrBand);
end;
TfrPages = class(TObject)
private
FPages: TList;
Parent: TfrReport;
function GetCount: Integer;
function GetPages(Index: Integer): TfrPage;
public
constructor Create(AParent: TfrReport);
destructor Destroy; override;
procedure Clear;
procedure Add;
procedure Delete(Index: Integer);
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
property Pages[Index: Integer]: TfrPage read GetPages; default;
property Count: Integer read GetCount;
end;
TfrEMFPages = class(TObject)
private
FPages: TList;
Parent: TfrReport;
function GetCount: Integer;
function GetPages(Index: Integer): PfrPageInfo;
procedure ExportData(Index: Integer);
procedure PageToObjects(Index: Integer);
procedure ObjectsToPage(Index: Integer);
public
constructor Create(AParent: TfrReport);
destructor Destroy; override;
procedure Clear;
procedure Draw(Index: Integer; Canvas: TCanvas; DrawRect: TRect);
procedure Add(APage: TfrPage);
procedure Insert(Index: Integer; APage: TfrPage);
procedure Delete(Index: Integer);
procedure LoadFromStream(AStream: TStream);
procedure SaveToStream(AStream: TStream);
property Pages[Index: Integer]: PfrPageInfo read GetPages; default;
property Count: Integer read GetCount;
end;
TfrReport = class(TComponent)
private
FPages: TfrPages;
FEMFPages: TfrEMFPages;
FVars: TStrings;
FVal: TfrValues;
FDataset: TfrDataset;
FGrayedButtons: Boolean;
FReportType: TfrReportType;
FTitle: String;
FShowProgress: Boolean;
FModalPreview: Boolean;
FModifyPrepared: Boolean;
FStoreInDFM: Boolean;
FPreview: TfrPreview;
FPreviewButtons: TfrPreviewButtons;
FInitialZoom: TfrPreviewZoom;
FOnBeginDoc: TBeginDocEvent;
FOnEndDoc: TEndDocEvent;
FOnBeginPage: TBeginPageEvent;
FOnEndPage: TEndPageEvent;
FOnBeginBand: TBeginBandEvent;
FOnEndBand: TEndBandEvent;
FOnGetValue: TDetailEvent;
FOnEnterRect: TEnterRectEvent;
FOnProgress: TProgressEvent;
FOnFunction: TFunctionEvent;
FOnBeginColumn: TBeginColumnEvent;
FOnPrintColumn: TPrintColumnEvent;
FOnManualBuild: TManualBuildEvent;
FCurrentFilter: TfrExportFilter;
FPageNumbers: String;
FCopies: Integer;
FCurPage: TfrPage;
function FormatValue(V: Variant; Format: Integer;
const FormatStr: String): String;
procedure OnGetParsFunction(const name: String; p1, p2, p3: Variant;
var val: String);
procedure PrepareDataSets;
procedure BuildBeforeModal(Sender: TObject);
procedure ExportBeforeModal(Sender: TObject);
procedure PrintBeforeModal(Sender: TObject);
function DoPrepareReport: Boolean;
procedure DoBuildReport; virtual;
procedure DoPrintReport(PageNumbers: String; Copies: Integer);
procedure SetPrinterTo(PrnName: String);
procedure SetVars(Value: TStrings);
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadBinaryData(Stream: TStream);
procedure WriteBinaryData(Stream: TStream);
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
CanRebuild: Boolean; // true, if report can be rebuilded
Terminated: Boolean;
PrintToDefault, DoublePass: WordBool;
FinalPass: Boolean;
FileName: String;
FR3Stream: Boolean;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
// service methods
function FindVariable(Variable: String): Integer;
procedure GetVariableValue(const s: String; var v: Variant);
procedure GetVarList(CatNo: Integer; List: TStrings);
procedure GetCategoryList(List: TStrings);
function FindObject(Name: String): TfrView;
// internal events used through report building
procedure InternalOnEnterRect(Memo: TStringList; View: TfrView);
procedure InternalOnExportData(View: TfrView);
procedure InternalOnExportText(x, y: Integer; const text: String; View: TfrView);
procedure InternalOnGetValue(ParName: String; var ParValue: String);
procedure InternalOnProgress(Percent: Integer);
procedure InternalOnBeginColumn(Band: TfrBand);
procedure InternalOnPrintColumn(ColNo: Integer; var ColWidth: Integer);
procedure FillQueryParams;
// load/save methods
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
procedure LoadFromFile(FName: String);
procedure SaveToFile(FName: String);
procedure SaveToFR3File(FName: String);
{$IFDEF IBO}
procedure LoadFromDB(Table: TIB_DataSet; DocN: Integer);
procedure SaveToDB(Table: TIB_DataSet; DocN: Integer);
{$ELSE}
procedure LoadFromDB(Table: TDataSet; DocN: Integer);
procedure SaveToDB(Table: TDataSet; DocN: Integer);
{$ENDIF}
procedure LoadTemplate(fname: String; comm: TStrings;
Bmp: TBitmap; Load: Boolean);
procedure SaveTemplate(fname: String; comm: TStrings; Bmp: TBitmap);
procedure LoadPreparedReport(FName: String);
procedure SavePreparedReport(FName: String);
// report manipulation methods
procedure DesignReport;
function PrepareReport: Boolean;
procedure ExportTo(Filter: TClass; FileName: String);
procedure ShowReport;
procedure ShowPreparedReport;
procedure PrintPreparedReport(PageNumbers: String; Copies: Integer);
function ChangePrinter(OldIndex, NewIndex: Integer): Boolean;
procedure EditPreparedReport(PageIndex: Integer);
//
property Pages: TfrPages read FPages;
property EMFPages: TfrEMFPages read FEMFPages write FEMFPages;
property Variables: TStrings read FVars write SetVars;
property Values: TfrValues read FVal write FVal;
published
property Dataset: TfrDataset read FDataset write FDataset;
property GrayedButtons: Boolean read FGrayedButtons write FGrayedButtons default False;
property InitialZoom: TfrPreviewZoom read FInitialZoom write FInitialZoom;
property ModalPreview: Boolean read FModalPreview write FModalPreview default True;
property ModifyPrepared: Boolean read FModifyPrepared write FModifyPrepared default True;
property Preview: TfrPreview read FPreview write FPreview;
property PreviewButtons: TfrPreviewButtons read FPreviewButtons write FPreviewButtons;
property ReportType: TfrReportType read FReportType write FReportType default rtSimple;
property ShowProgress: Boolean read FShowProgress write FShowProgress default True;
property StoreInDFM: Boolean read FStoreInDFM write FStoreInDFM default False;
property Title: String read FTitle write FTitle;
property OnBeginDoc: TBeginDocEvent read FOnBeginDoc write FOnBeginDoc;
property OnEndDoc: TEndDocEvent read FOnEndDoc write FOnEndDoc;
property OnBeginPage: TBeginPageEvent read FOnBeginPage write FOnBeginPage;
property OnEndPage: TEndPageEvent read FOnEndPage write FOnEndPage;
property OnBeginBand: TBeginBandEvent read FOnBeginBand write FOnBeginBand;
property OnEndBand: TEndBandEvent read FOnEndBand write FOnEndBand;
property OnGetValue: TDetailEvent read FOnGetValue write FOnGetValue;
property OnEnterRect: TEnterRectEvent read FOnEnterRect write FOnEnterRect;
property OnUserFunction: TFunctionEvent read FOnFunction write FOnFunction;
property OnProgress: TProgressEvent read FOnProgress write FOnProgress;
property OnBeginColumn: TBeginColumnEvent read FOnBeginColumn write FOnBeginColumn;
property OnPrintColumn: TPrintColumnEvent read FOnPrintColumn write FOnPrintColumn;
property OnManualBuild: TManualBuildEvent read FOnManualBuild write FOnManualBuild;
end;
TfrCompositeReport = class(TfrReport)
private
procedure DoBuildReport; override;
public
Reports: TList;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TfrReportDesigner = class(TForm)
public
Page: TfrPage;
Modified: Boolean;
procedure RegisterObject(ButtonBmp: TBitmap; const ButtonHint: String;
ButtonTag: Integer); virtual; abstract;
procedure RegisterTool(MenuCaption: String; ButtonBmp: TBitmap;
OnClick: TNotifyEvent); virtual; abstract;
procedure BeforeChange; virtual; abstract;
procedure AfterChange; virtual; abstract;
procedure RedrawPage; virtual; abstract;
end;
TfrDataManager = class(TObject)
public
procedure LoadFromStream(Stream: TStream); virtual; abstract;
procedure SaveToStream(Stream: TStream); virtual; abstract;
procedure BeforePreparing; virtual; abstract;
procedure AfterPreparing; virtual; abstract;
procedure PrepareDataSet(ds: TfrTDataSet); virtual; abstract;
function ShowParamsDialog: Boolean; virtual; abstract;
procedure AfterParamsDialog; virtual; abstract;
end;
TfrObjEditorForm = class(TForm)
public
procedure ShowEditor(t: TfrView); virtual;
end;
TfrExportFilter = class(TObject)
protected
Stream: TStream;
Lines: TList;
procedure ClearLines;
public
constructor Create(AStream: TStream); virtual;
destructor Destroy; override;
procedure OnBeginDoc; virtual;
procedure OnEndDoc; virtual;
procedure OnBeginPage; virtual;
procedure OnEndPage; virtual;
procedure OnData(x, y: Integer; View: TfrView); virtual;
procedure OnText(x, y: Integer; const text: String; View: TfrView); virtual;
end;
TfrFunctionLibrary = class(TObject)
public
List: TStringList;
constructor Create; virtual;
destructor Destroy; override;
function OnFunction(const FName: String; p1, p2, p3: Variant;
var val: String): Boolean;
procedure DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: String);
virtual; abstract;
end;
TfrCompressor = class(TObject)
public
Enabled: Boolean;
procedure Compress(StreamIn, StreamOut: TStream); virtual;
procedure DeCompress(StreamIn, StreamOut: TStream); virtual;
end;
function frCreateObject(Typ: Byte; const ClassName: String): TfrView;
procedure frRegisterObject(ClassRef: TClass; ButtonBmp: TBitmap;
const ButtonHint: String; EditorForm: TfrObjEditorForm);
procedure frRegisterExportFilter(ClassRef: TClass;
const FilterDesc, FilterExt: String);
procedure frRegisterFunctionLibrary(ClassRef: TClass);
procedure frRegisterTool(MenuCaption: String; ButtonBmp: TBitmap; OnClick: TNotifyEvent);
function GetDefaultDataSet: TfrTDataSet;
const
frCurrentVersion = 23; // this is current version (2.3)
frSpecCount = 9;
frSpecFuncs: Array[0..frSpecCount - 1] of String = ('PAGE#', '',
'DATE', 'TIME', 'LINE#', 'LINETHROUGH#', 'COLUMN#', 'CURRENT#', 'TOTALPAGES');
frColors: Array[0..15] of TColor =
(clWhite, clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal,
clGray, clSilver, clRed, clLime, clYellow, clBlue, clFuchsia, clAqua);
type
PfrTextRec = ^TfrTextRec;
TfrTextRec = record
Next: PfrTextRec;
X: Integer;
Text: String[255];
FontName: String[32];
FontSize, FontStyle, FontColor, FontCharset, FillColor: Integer;
end;
TfrAddInObjectInfo = record
ClassRef: TClass;
EditorForm: TfrObjEditorForm;
ButtonBmp: TBitmap;
ButtonHint: String;
end;
TfrExportFilterInfo = record
ClassRef: TClass;
FilterDesc, FilterExt: String;
end;
TfrFunctionInfo = record
FunctionLibrary: TfrFunctionLibrary;
end;
TfrToolsInfo = record
Caption: String;
ButtonBmp: TBitmap;
OnClick: TNotifyEvent;
end;
var
frDesigner: TfrReportDesigner; // designer reference
frDataManager: TfrDataManager; // data manager reference
frParser: TfrParser; // parser reference
frInterpretator: TfrInterpretator; // interpretator reference
frVariables: TfrVariables; // report variables reference
frCompressor: TfrCompressor; // compressor reference
CurReport: TfrReport; // currently proceeded report
MasterReport: TfrReport; // reference to main composite report
CurView: TfrView; // currently proceeded view
CurBand: TfrBand; // currently proceeded band
CurPage: TfrPage; // currently proceeded page
DocMode: (dmDesigning, dmPrinting); // current mode
DisableDrawing: Boolean;
frAddIns: Array[0..31] of TfrAddInObjectInfo; // add-in objects
frAddInsCount: Integer;
frFilters: Array[0..31] of TfrExportFilterInfo; // export filters
frFiltersCount: Integer;
frFunctions: Array[0..31] of TfrFunctionInfo; // function libraries
frFunctionsCount: Integer;
frTools: Array[0..31] of TfrToolsInfo; // tools
frToolsCount: Integer;
PageNo: Integer; // current page number in Building mode
frCharset: 0..255;
frBandNames: Array[0..21] of String;
frSpecArr: Array[0..frSpecCount - 1] of String;
frDateFormats, frTimeFormats: Array[0..3] of String;
frVersion: Byte; // version of currently loaded report
SMemo: TStringList; // temporary memo used during TfrView drawing
ShowBandTitles: Boolean = True;
(*
FRE_COMPATIBLEREAD variable added for migrating from older versions
of FreeReport and will be removed in next releases as soon as possible.
*)
{$IFDEF FREEREP2217READ}
FRE_COMPATIBLE_READ: Boolean = False;
{$ENDIF}
implementation
uses
FR_Fmted, FR_Prntr, FR_Progr, FR_Utils, FR_Const
{$IFDEF JPEG}, JPEG {$ENDIF};
{$R FR_Lng1.RES}
type
TfrStdFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: String); override;
end;
TInterpretator = class(TfrInterpretator)
public
procedure GetValue(const Name: String; var Value: Variant); override;
procedure SetValue(const Name: String; Value: Variant); override;
procedure DoFunction(const name: String; p1, p2, p3: Variant;
var val: String); override;
end;
var
VHeight: Integer; // used for height calculation of TfrMemoView
SBmp: TBitmap; // small bitmap used by TfrBandView drawing
TempBmp: TBitmap; // temporary bitmap used by TfrMemoView
CurDate, CurTime: TDateTime; // date/time of report starting
CurValue: Variant; // used for highlighting
AggrBand: TfrBand; // used for aggregate functions
CurVariable: String;
IsColumns: Boolean;
SavedAllPages: Integer; // number of pages in entire report
ErrorFlag: Boolean; // error occured through TfrView drawing
ErrorStr: String; // error description
SubValue: String; // used in GetValue event handler
ObjID: Integer = 0;
BoolStr: Array[0..3] of String;
HookList: TList;
// variables used through report building
PrevY, PrevBottomY, ColumnXAdjust: Integer;
Append, WasPF: Boolean;
CompositeMode: Boolean;
{----------------------------------------------------------------------------}
function frCreateObject(Typ: Byte; const ClassName: String): TfrView;
var
i: Integer;
begin
Result := nil;
case Typ of
gtMemo: Result := TfrMemoView.Create;
gtPicture: Result := TfrPictureView.Create;
gtBand: Result := TfrBandView.Create;
gtSubReport: Result := TfrSubReportView.Create;
gtLine: Result := TfrLineView.Create;
gtAddIn:
begin
for i := 0 to frAddInsCount - 1 do
if frAddIns[i].ClassRef.ClassName = ClassName then
begin
Result := TfrView(frAddIns[i].ClassRef.NewInstance);
Result.Create;
Result.Typ := gtAddIn;
break;
end;
if Result = nil then
raise EClassNotFound.Create('湾 磬殇屙 觌囫
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -