在Delphi7中RaveReport的使用

本文档介绍了如何在Delphi7中利用RaveReport控件进行票据打印程序的开发,包括创建报告、添加文本、数据绑定、预览及打印等功能的详细步骤和关键函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        近段时间用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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值