原創(chuàng)|其它|編輯:郝浩|2012-09-10 12:00:04.000|閱讀 1169 次
概述:前面我們講到FASTREPORT實(shí)現(xiàn)WEB應(yīng)用中自定義報(bào)表,會(huì)用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內(nèi)容,現(xiàn)在就來說一下里面的ACTIVEX部分
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
如何用FASTREPORT實(shí)現(xiàn)WEB應(yīng)用中自定義報(bào)表(一)
如何用FASTREPORT實(shí)現(xiàn)WEB應(yīng)用中自定義報(bào)表(二)前面我們講到FASTREPORT實(shí)現(xiàn)WEB應(yīng)用中自定義報(bào)表,會(huì)用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內(nèi)容,現(xiàn)在就來說一下里面的ACTIVEX部分:
ACTIVEX
方案中的ACTIVEX控件主要做兩方面的事情,一是報(bào)表利用FASTREPORT控件進(jìn)行報(bào)表處理,包括報(bào)表設(shè)計(jì)(.frf文件)和報(bào)表打?。?frp文件)。一是與WEB SERVER進(jìn)行通信,請(qǐng)求和接收包文件。
在DELPHI中NEW一個(gè)ActiveForm 應(yīng)用,取名為reportAForm。在form中加入Combox、button、edit、label等與用戶交互的控件;為了處理報(bào)表,加入FASTREPORT的多個(gè)frSpeedButton用于處理報(bào)表事件,如設(shè)計(jì)、預(yù)覽、打印、翻頁、保存等;加入frReport、frDBDataSet、frDesigner等用于在運(yùn)行時(shí)設(shè)計(jì)報(bào)表;如果設(shè)計(jì)報(bào)表時(shí)要使用圖形、復(fù)選框等內(nèi)容,也要加入相應(yīng)的控件;加入frPreview、frTextExport、frRTFExport等控件使可以預(yù)覽報(bào)表并可以將報(bào)表輸出為text、rtf等格式文件;加入ADOQuery(根據(jù)實(shí)際需要可加入多個(gè))為報(bào)表設(shè)計(jì)提供數(shù)據(jù)環(huán)境,ADOQuery不OPEN,不與數(shù)據(jù)庫連接;加入NMHTTP用于與WEB SERVER聯(lián)系。加入四個(gè)函數(shù):DesignReport(rpFileName:String),PrintReport(rpFileName:String),unzipReportFiles(rpFileName:String),getReportFile(rpFileName,mode:String)分別用于設(shè)計(jì)報(bào)表、打印報(bào)表、解壓縮報(bào)表和向WEB SERVER發(fā)送請(qǐng)求以取得報(bào)表文件 。
getReportFile(rpFileName,mode:String)方法:
function TreportAForm.getReportFile(rpFileName,mode:String):bool
var
……
zipFileName:String;
begin
……
zipFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.zip',
[rfReplaceAll, rfIgnoreCase]);
try
NMHTTP1.inputFileMode := TRUE;
NMHTTP1.body:='.\ '+ zipFileName;
NMHTTP1.Get('//www…./../report.jsp?rpFileName='+
rpFileName+'&mode='+mode);
Result:=true;
except
on Exception do
Result:=false;
end;
end;
函數(shù)getReportFile的作用是向WEB SERVER發(fā)送報(bào)表請(qǐng)求(通過NMHTTP的Get方法),并將返回的壓縮包文件保存到本地硬盤(zipFileName)。
unzipReportFiles(rpFileName:String)方法:
function TreportAForm.unzipReportFiles(rpFileName:String) :boolean;
var
……
zipFileName,fileName:String;
zipCount:Integer;
begin
……
zipFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.zip',
[rfReplaceAll, rfIgnoreCase]);
fileName:= ExtractFileName(rpFileName);
fileName:= ChangeFileExt(fileName,'.*');
try
VCLUnZip1.ZipName:= '.\'+ zipFileName;
VCLUnZip1.DestDir:= '.\';
VCLUnZip1.OverwriteMode:= Always;
VCLUnZip1.ReadZip;
VCLUnZi
p1.FilesList.Add(fileName);
zipCount:= VCLUnZip1.UnZip;
if zipCount = 0 then
result:=false
else
result:=true;
exce
on Exception do
result:=false;
end;
end;
函數(shù)unzipReportFiles的作用是將壓縮包中的文件解壓出來,供ACTIVEX使用。它與REPORT SERVER程序中的zipReportFiles剛好是個(gè)相反的過程。
DesignReport(rpFileName:String)方法:
function TreportAForm. DesignReport (rpFileName:String) :boolean;
var
dtfFileName,rpFileName:String;
fldlist:TStringList;
T: TStringField;
i:Integer;
begin
……
dtfFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.dtf',
[rfReplaceAll, rfIgnoreCase]);//獲得數(shù)據(jù)環(huán)境文件名
fldlist:=TStringList.Create;
fldlist.LoadFromFile(dtfFileName);
rpAdoquery.Fields.Clear;
for i := 0 to fldlist.Count - 1 do
begin
T := TStringField.Create(nil);
T.FieldName := fldlist[i];
T.Name := rpAdoquery.Name + T.FieldName;
rpAdoquery.Fields.add(T);
end;
FrReport1.LoadFromFile(rpFileName);
FrReport1.DesignReport;
end;
函數(shù)DesignReport先從.dtf(由REPORT SERVER生成)文件中恢復(fù)報(bào)表的數(shù)據(jù)環(huán)境,接著使用FASTREPORT的FrReport控件設(shè)計(jì)報(bào)表。在FASTREPORT中,對(duì)DataSet中的Field只關(guān)心名稱(全部通過Variant類型處理),而并不關(guān)心數(shù)據(jù)類型,所以恢復(fù)報(bào)表的數(shù)據(jù)環(huán)境時(shí),所有字段都當(dāng)作String類型加入。樣例假設(shè)報(bào)表只有一個(gè)名為rpAdoquery的DataSet。報(bào)表設(shè)計(jì)運(yùn)行時(shí)窗口在ACTIVEX進(jìn)程空間運(yùn)行。
用戶端設(shè)計(jì)好報(bào)表并保存后,需要將保存的報(bào)表文件(.frf)回送給服務(wù)器存儲(chǔ)。文件上傳對(duì)于大部分開發(fā)人員來說應(yīng)該都是熟悉而簡(jiǎn)單的,該部分程序本文就省略了。
PrintReport(rpFileName:String)方法:
function TreportAForm. PrintReport (rpFileName:String) :boolean;
var
repFileName:String;
begin
……
repFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.frp',
[rfReplaceAll, rfIgnoreCase]);//獲得已準(zhǔn)備的報(bào)表文件名
try
frPreview1.clear;
FrReport1.Preview:=nil;
FrReport1.clear;
FrReport1.LoadPreparedReport(repFileName);
FrReport1.Preview :=frPreview1;
FrReport1.ShowPreparedReport;
result:=true;
except
on Exception do
result:=false;
end;
end;
函數(shù)PrintReport裝入由REPORT SERVER運(yùn)行好的報(bào)表.frp文件,通過調(diào)用FrReport的ShowPreparedReport方法在ACTIVEX端預(yù)覽和打印。
方案實(shí)現(xiàn)方法的介紹結(jié)束。本方案具有的優(yōu)點(diǎn)為:保持應(yīng)用的結(jié)構(gòu)形式不變(B/S),將C/S應(yīng)用結(jié)構(gòu)下已非常成熟的報(bào)表方案移植過來,使得在WEB應(yīng)用中也可實(shí)現(xiàn)任意復(fù)雜的報(bào)表設(shè)計(jì)和打印,以及對(duì)打印效果進(jìn)行精確控制。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)