近段时间用Delphi7的RaveReport控件做票据打程序, 遇到不少问题. 幸好在网上得到得一些前辈(有意或无意)的帮助.得到不少心得. 在此表示感谢! 同时也将自己的所得拿出来与大家一起分享.
unit UReportClass;
interface
uses
Windows,classes,Forms,UGlobalSet,RpRave,RvClass,RvCSstd,RVProj,RpDefine,RpConDS,
RvDirectDataView,RvCsData,RvCsRpt,rvData,RpRenderPreView,Rpfiler,sysUtils,
RpRenderPrinter,rvUtil,Controls,Graphics,RvCsDraw,RpBase,Printers;
type
ReportClass=class(TComponent)
private
ClsIndexList:TStringList;
FRpPage:TRavePage;
FReport:TRaveReport;
function GetReportName: CString;
procedure SetOnPVPageChange(const Value: TNotifyEvent);
function GetPVPageChange: TNotifyEvent;
protected
RvProject: TRvProject;
RvNDRWriter: TRvNDRWriter;
RvRenderPreView: TRvRenderPreView;
RvRenderPrinter: TRvRenderPrinter;
DataViewList:TList;
function GetCtrlName(Cls:TClass):CString;
public
PreViewTop,PreViewLeft:Integer;
property OnPVPageChange:TNotifyEvent read GetPVPageChange write SetOnPVPageChange;
//
property ReportName:CString read GetReportName;
procedure ProjectExecute;
constructor Create(AWoner:TComponent);override;
destructor Destroy;override;
//
function AddText(Parent:TRavecomponent;aText:CString;Top,Left,
width,Height:Single;Font:TRaveFont):TRaveText;
function AddDataText(Parent:TRavecomponent;DataViewId:Integer;
FieldName:CString;Top,Left,width,
Height:Single;Font:TRaveFont):TRaveDataText;
function AddRegion(Parent:TRavecomponent;Top,Left,width,Height:Single):TRaveRegion;
function AddDataBind(RvRegion:TRaveRegion;Height:Single;DataViewID:Integer):TRaveDataBand;
function AddDataCycle(dataViewId:Integer):TRaveDataCycle;
function AddBitmap(parent: TRavecomponent;aBitmap:TBitmap;
Top,Left,width,Height:Single): TRaveBitmap;
//
function XPointToInch(X:Integer):Single;//点坐标到英寸
function YPointToInch(Y:Integer):Single;//点坐标到英寸
procedure AddDataSetConnection(DSConn:TRvDataSetConnection); //加入数据连接
procedure SaveRav; //保存报表
//以下全部是关于预览的函数与过程
procedure PreView(ScrollBox:TScrollBox);
procedure PreViewfirstPage;
Procedure PreViewPrevPage;
Procedure PreViewNextPage;
procedure PreViewLastPage;
procedure GotoPage(Index:Integer);
procedure PreViewReDrawPage;
procedure PreViewZoomIn;
procedure PreViewZoomOut;
procedure PreViewFitPage;
function PreviewPages:Integer;
function PreviewCurPage:Integer;
function PreviewBof:Boolean; //首页
function PreviewEof:Boolean; //尾页
function PreViewPrinter:Boolean; //预览后打印
procedure refreshScollBox;
//设置页面大小
procedure SetPageSize(Height,Width:Single);
function Printer:Boolean; //打印
end;
implementation
{ ReportClass }
function ReportClass.AddBitmap(parent: TRavecomponent;aBitmap:TBitmap;Top,Left,width,Height:Single): TRaveBitmap;
var
RvBmp:TRaveBitmap;
begin
if Parent=nil then Parent:=FRpPage;
RvBmp:=TRaveBitmap.Create(parent);
RvBmp.Name:=GetCtrlName(TRaveBitmap);
Rvbmp.Parent:=parent;
RvBmp.Top:=Top;
RvBmp.Left:=Left;
if Assigned(aBitmap) then
begin
RvBmp.Image.Assign(aBitmap);
end;
Result:=RvBmp;
end;
function ReportClass.AddDataBind(RvRegion: TRaveRegion; Height:Single;
DataViewID: Integer): TRaveDataBand;
var
RvDataBand:TRaveDataBand;
begin
RvDataBand:=TRaveDataBand.Create(RvRegion);
RvDataBand.Name:=GetCtrlName(TRaveDataBand);
RvDataBand.Parent:=RvRegion;
RvDataBand.Height:=Height;
RvDataBand.DataView:=TRaveDataView(DataViewList.items[DataViewID]);
Result:=RvDataBand;
end;
function ReportClass.AddDataCycle(dataViewId: Integer): TRaveDataCycle;
var
Cycle:TRaveDataCycle;
begin
Cycle:=TRaveDataCycle.Create(FRpPage);
Cycle.Name:=GetCtrlName(TRaveDataCycle);
Cycle.Parent:=FRpPage;
Cycle.DataView:=TRaveDataView(DataViewList.Items[dataViewId]);
Result:=Cycle;
end;
procedure ReportClass.AddDataSetConnection(DSConn: TRvDataSetConnection);
var
RvDataView:TRaveDataView;
FieldList:TList;
begin
FieldList:=TList.Create;
RvDataView:=RvProject.ProjMan.NewDataObject(TRaveDataView) as TRaveDataView;
RvDataView.Name:=GetCtrlName(TRaveDataView);
RvDataView.ConnectionName:=DSConn.Name;
rvData.CreateFields(RvDataView,nil,nil,true);
DataViewList.Add(RvDataView);
FieldList.Free;
end;
function ReportClass.AddDataText(Parent: TRavecomponent;
DataViewId: Integer; FieldName: CString; Top, Left,width,
Height: Single;Font:TRaveFont):TRaveDataText;
var
RvDataText:TRaveDataText;
begin
if Parent=nil then Parent:=FRpPage;
RvDataText:=TRaveDataText.Create(Parent);
RvDataText.Name:=GetCtrlName(TRaveDataText);
RvDataText.Parent:=Parent;
RvDataText.Top:=Top;
RvDataText.Left:=Left;
RvDataText.DataView:=TRaveDataView(DataViewList.Items[DataViewId]);
RvDataText.DataField:=FieldName;
if Assigned(Font) then RvDataText.Font.Assign(Font);
Result:=RvDataText;
end;
function ReportClass.AddRegion(Parent: TRavecomponent; Top, Left, width,
Height: Single): TRaveRegion;
var
RvRegion:TRaveRegion;
begin
if Parent=nil then Parent:=FRpPage;
RvRegion:=TRaveRegion.Create(Parent);
RvRegion.Name:=GetCtrlName(TRaveRegion);
RvRegion.Parent:=Parent;
RvRegion.Top:=Top;
RvRegion.Left:=Left;
RvRegion.Width:=Width;
RvRegion.Height:=Height;
Result:=RvRegion;
end;
function ReportClass.AddText(Parent:TRavecomponent;aText: CString; Top, Left,width,
Height: Single;Font:TRaveFont):TRaveText;
var
RvText:TRaveText;
begin
if Parent=nil then Parent:=FRpPage;
RvText:=TRaveText.Create(Parent);
RvText.Name:=GetCtrlName(TRaveText);
RvText.Parent:=Parent;
RvText.Top:=Top;
RvText.Left:=Left;
RvText.Text:=aText;
if Assigned(Font) then RvText.Font.Assign(Font);
Result:=RvText;
end;
constructor ReportClass.Create(AWoner: TComponent);
begin
inherited;
PreViewTop:=10;
PreViewLeft:=10;
ClsIndexList:=TStringList.Create;
DataViewList:=TList.Create ;
RvProject:=TRvProject.Create(self);
RvProject.New;
FReport:=RvProject.ProjMan.FindRaveComponent(ReportName,nil) as TRaveReport;
FRpPage:=FReport.FirstPage;
//
RvNDRWriter:=TRvNDRWriter.Create(self);
RvNDRWriter.StreamMode:=SMUser;
RvNDRWriter.Stream:=TMemoryStream.Create ;
RvRenderPreView:=TRvRenderPreView.Create(self);
RvRenderPrinter:=TRvRenderPrinter.Create(self);
end;
destructor ReportClass.Destroy;
begin
RvRenderPrinter.Free;
RvNDRWriter.Stream.Free;
RvNDRWriter.Free;
RvRenderPreView.Free;
//
RvProject.Free;
DataViewList.Free;
ClsIndexList.Free;
inherited;
end;
function ReportClass.GetCtrlName(Cls: TClass): CString;
var
idx:Integer;
begin
idx:=StrToIntDef(ClsIndexList.Values[cls.ClassName],0);
Result:=cls.ClassName+inttostr(idx);
ClsIndexList.Values[cls.ClassName]:=IntToStr(idx+1);
end;
function ReportClass.GetReportName: CString;
begin
Result:=RvProject.ReportName;
end;
function ReportClass.PreviewPages: Integer;
begin
Result:=RvRenderPreView.Pages
end;
procedure ReportClass.PreView(ScrollBox: TScrollBox);
begin
RvProject.Engine:=RvNDRWriter;
RvProject.Execute;
RvRenderPreView.ScrollBox:=ScrollBox;
RvRenderPreView.Render(RvNDRWriter.Stream);
refreshScollBox;
RvProject.Engine:=nil;
end;
procedure ReportClass.PreViewfirstPage;
begin
RvRenderPreView.RenderPage(0);
refreshScollBox;
end;
procedure ReportClass.PreViewLastPage;
begin
RvRenderPreView.RenderPage(RvRenderPreView.Pages);
refreshScollBox;
end;
procedure ReportClass.PreViewNextPage;
begin
RvRenderPreView.NextPage;
refreshScollBox;
end;
procedure ReportClass.PreViewPrevPage;
begin
RvRenderPreView.PrevPage;
refreshScollBox;
end;
function ReportClass.PreViewPrinter: Boolean;
begin
RvRenderPrinter.Render(RvNDRWriter.Stream);
Result:=True;
end;
function ReportClass.Printer: Boolean;
begin
RvProject.Engine:=RvNDRWriter;
RvProject.Execute;
Result:=PreViewPrinter;
RvProject.Engine:=nil;
end;
procedure ReportClass.ProjectExecute;
begin
RvProject.Execute
end;
procedure ReportClass.SaveRav;
begin
RvProject.SaveToFile('RP.rav');
end;
procedure ReportClass.SetPageSize(Height, Width: single);
begin
//若设置大小超出范围,将不起作用
FRpPage.PageHeight:=Height;
FRpPage.PageWidth:=Width;
end;
function ReportClass.PreviewBof: Boolean;
begin
if RvRenderPreView.CurrentPage=1 then
Result:=True
else Result:=False;
end;
function ReportClass.PreviewEof: Boolean;
begin
if RvRenderPreView.CurrentPage=RvRenderPreView.Pages then
Result:=True
else Result:=False;
end;
procedure ReportClass.SetOnPVPageChange(const Value: TNotifyEvent);
begin
RvRenderPreView.OnPageChange := Value;
end;
function ReportClass.GetPVPageChange: TNotifyEvent;
begin
Result := RvRenderPreView.OnPageChange;
end;
function ReportClass.PreviewCurPage: Integer;
begin
Result:=RvRenderPreView.CurrentPage;
end;
procedure ReportClass.GotoPage(Index: Integer);
begin
if (Index>0) And (Index<=RvRenderPreView.Pages) then
begin
RvRenderPreView.RenderPage(Index);
refreshScollBox;
end;
end;
procedure ReportClass.PreViewReDrawPage;
begin
RvRenderPreView.RedrawPage;
end;
procedure ReportClass.PreViewZoomIn;
begin
RvRenderPreView.ZoomIn ;
refreshScollBox;
end;
procedure ReportClass.PreViewZoomOut;
begin
RvRenderPreView.ZoomOut ;
refreshScollBox;
end;
procedure ReportClass.PreViewFitPage;
begin
RvRenderPreView.ZoomFactor:=RvRenderPreView.ZoomPageFactor;
refreshScollBox
end;
procedure ReportClass.refreshScollBox;
begin
RvRenderPreView.ScrollBox.ScrollBy(PreViewTop,PreViewLeft);
RvRenderPreView.ScrollBox.Refresh;
end;
function ReportClass.XPointToInch(X: Integer): Single;
var
dpiX:Integer;
begin
dpiX := GetDeviceCaps(GetDC(0),LOGPIXELSX);
Result := X/dpiX;
end;
function ReportClass.YPointToInch(Y: Integer): Single;
var
dpiY:Integer;
begin
dpiY := GetDeviceCaps(GetDC(0),LOGPIXELSY);
Result := Y/dpiY;
end;
end.