UniGui中使用Grid++Report报表控件主要是通过TUniHTMLFrame控件中嵌入HTML代码来进行调用,我们可以直接在delphi中动态修改这个HTML代码来实现不同数据源及报表模板的报表打印与展示。下面是这是TUniHTMLFrame控件中的HTML属性的代码:
<HTML> <HEAD> <TITLE>Web报表(B/S报表)演示 - 最简单例子,用插件在网页中展现报表,实际应用采用 simple_UseCreateControl.htm 的方式更简便</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> </HEAD> <BODY style="margin:0" style="margin:0"> <OBJECT classid="CLSID:E060AFE6-5EFF-4830-B7F0-093ECC08EF37" codebase="../griectl.cab#Version=5.6.12.325" width="100%" height="100%" id="ReportViewer" VIEWASTEXT> <param name="ReportURL" value="####"> <!--报表模板标记,在程序代码中替换--> <param name="DataURL" value="****"> <!--报表数据URL的文件标记,在程序代码中替换--> </OBJECT> <script> document.getElementById('ReportViewer').ResizeColumnToFit(); document.getElementById('ReportViewer').UpdateViewer(); </script> </BODY> </HTML>
下面是Main.pas的代码,很简单:
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIForm, uniGUIBaseClasses, uniPanel, uniURLFrame, uniHTMLFrame, uniButton,System.StrUtils; type TMainForm = class(TUniForm) UniPanel1: TUniPanel; UniHTMLFrame1: TUniHTMLFrame; procedure UniFormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; function MainForm: TMainForm; implementation {$R *.dfm} uses uniGUIVars, MainModule, UntCommon, ServerModule; function MainForm: TMainForm; begin Result := TMainForm(UniMainModule.GetFormInstance(TMainForm)); end; procedure TMainForm.UniFormCreate(Sender: TObject); var s,f:string; t:TStringList; begin t:=nil; //创建时修改Html文件中的ReportUrl,和DataURL的参数。 //s为打印的Html模板 s := StringReplace(UniHTMLFrame1.HTML.Text,'####','files/simple.txt',[rfReplaceAll]); f:= UniServerModule.LocalCacheURL+ 'simple.xml'; //定义报表数据URL的文件路径及文件名 s := StringReplace(s,'****',f,[rfReplaceAll]); //替换报表数据dataUrl为定义的文件名 UniHTMLFrame1.HTML.Text :=s; //重新给UniHTMLFrame的html属性赋值 try t := TStringList.Create; s := DataSetToXml(UniMainModule.UniQuery1); //转换DataSet数据到XML t.Add(s); t.SaveToFile(f,TEncoding.UTF8); //创建 报表数据文件文件并写入服务器硬盘,供报表调用 finally t.Free; end; end; initialization RegisterMainFormClass(TMainForm); end.
DataSetToXml命令是用于将dataset的数据转化为一个Grid++Report报表插件需求的xml数据格式,Grid++report报表插件的数据xml格式要求可以到Grid++Report的网站查询:http://www.rubylong.cn下面是DataSetToxml函数所有的UntCommon.pas单元的代码:
unit UntCommon; interface uses Data.db,System.SysUtils,System.StrUtils; function DataSetToXml(ADataset:tdataset):string; function SetLeftStr(Astring:string ):string; function SetRightStr(Astring:string ):string; implementation //这里生成一个符合Grid++Report约定的xml数据文件。 function DataSetToXml(ADataset: tdataset): string; var FieldCount:Integer; I: Integer; begin Result :='<xml>' +#13#10 ; ADataset.DisableControls; ADataset.First; while not ADataset.Eof do begin Result := Result +'<row> '; for I := 0 to ADataset.FieldCount-1 do begin with ADataset.Fields[i] do case DataType of ftString: begin Result := Result + SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName); end; ftSmallint,ftInteger,ftWord: begin Result := Result+ SetLeftStr(FieldName) +inttostr(AsInteger)+ SetRightStr(FieldName); end; ftBoolean: begin Result := Result + SetLeftStr(FieldName)+booltostr(asboolean)+ SetRightStr(FieldName); end; ftFloat,ftCurrency: begin Result := Result+SetLeftStr(FieldName)+FloatTostr(AsFloat)+ SetRightStr(FieldName); end; ftDate: begin Result := Result+SetLeftStr(FieldName)+DateToStr(AsDateTime)+ SetRightStr(FieldName); end; ftDateTime: begin Result := Result+SetLeftStr(FieldName)+DateTimeToStr(AsDateTime)+ SetRightStr(FieldName); end; ftAutoInc: begin Result := Result + SetLeftStr(FieldName)+inttostr(AsInteger)+ SetRightStr(FieldName); end; ftMemo: begin Result := Result+ SetLeftStr(FieldName)+AsString+ SetRightStr(FieldName); end; end; end; Result := Result +'</row> '+#13#10 ; ADataset.Next; end; ADataset.EnableControls; Result :=Result +'</xml>'; end; function SetLeftStr(Astring: string): string; begin Result :='<'+astring+'>'; end; function SetRightStr(Astring: string): string; begin Result :='</'+astring+'>'; end; end.
下面是在IE浏览器中正常运行时的截图:
目前Grid++Report还不能跨IE\谷歌\firefox浏览器使用,需要跨平台的朋友可以暂时无视。据说Grid++Report目前正在开发firefox的插件,以grid++report的一贯风格来讲,新旧版本的兼容性做的好,如果grid++report from firefox插件能推出来,旧项目的代码应该不会有太多修改,所以grid++report from firefox插件是一个非常值得期待的版本。