FastReport幾個使用技巧


1.FastReport中如何共用TFrxreport及TfrxDBDataSet

 

一個程序中,不管多么大的程序,只要打印或預覽時是模式的,則完全可以共用一個TFrxreport

 

變量及幾個TfrxDBDataSet。只不過,要注意完成一個報表程序的步驟,主要是下面幾步
1)清除報表,得到一個全新的報表內容。
Frxreport1.clear。
2)設置要使用的TfrxDBDataSet的別名,如果不需要可以省略這一步,但一般最好不同的報表用不同的別名。
注意這一步要在加載報表文件之前,因為一般設計報表文件時已經包含了別名信息。
frxDBDataSet1.UserName:=別名;
3)加載報表或動態建立一個TfrxReportPage。
Frxreport1.LoadFromFile(報表文件的完整文件名);
4)關聯TfrxDBDataSet與TDataset,並設置要使用哪些TfrxDBDataSet。
Frxreport1.DataSets.Clear;//先清除原來的數據集
frxDBDataSet1.DataSet:=dataset1;//關聯Fastreport的組件與TDataset數據集。
Frxreport1.DataSets.Add(frxDBDataSet1);//加載關聯好的TfrxDBDataSet到報表中。
經過這幾步后,就可以像單獨使用一個Tfrxreport一樣使用共用的報表組件了

2.如何打印空白處?
在打印報表的Band處的OnBeforePrint事件中添加代碼:

while FreeSpace > 20 do
  ShowBand(Child1)

 

3.如何打印指定行數后換頁?
在master band中OnBeforePrint事件中寫代碼:

var
   vLineCount: integer;
begin
   vLineCount := vLineCount + 1;
   if vLineCount = 10 then
   begin
      vLineCount := 0;
      NewPage;
   end;
end;


 

4.fastreport中如何把數據顯示為百分比
DisplayFormat屬性,其中的Kind你設置成fkNumeric,FormatStr

[<frxDBDataset1."sjl">*100 #n%2.2f]%

 

5.FastReport如何打印表格式的空行?

var
   PageLine: integer;       //在現在頁列印到第幾行
   PageMaxRow: integer=15;  //設定每頁列數
   procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
   begin
       PageLine := <Line> mod PageMaxRow;
       if (PageLine = 1) and (<line> > 1) then
          Engine.newpage;
       child1.visible := False;
   end;

 

//Footer1高度設為0
  procedure Footer1OnBeforePrint(Sender: TfrxComponent);




  var
      i: integer;
  begin
      i := iif(PageLine=0, PageMaxRow, PageLine);
      child1.visible := True;
      while i < PageMaxRow do
      begin
          i := i + 1;
          Engine.ShowBand(Child1);  //印空白表格
      end;
      child1.visible := False;
    end;
begin
end.

 

 

 

6.在首頁打印本頁小計,最后一頁打印本頁小計和合計(如果只有一頁,則打印本頁小計和合計)

frxReport1.PrepareReport();
  frxReport1.Variables["pageQ"] := pageQ;
  frxReport1.Variables["hander"] := QuotedStr(hander);
  frxReport1.Variables["doubleline"] := QuotedStr(StringOfChar("=", Length(hander) + 12));




  whName :="設備資產";
  frxReport1.Variables["p1"] := QuotedStr("倉庫:" + whName);
  frxReport1.Variables["p9"] := QuotedStr("領用科室:" + DepName);
  frxReport1.Variables["p2"] := QuotedStr("日期:" + ywDate);
  frxReport1.Variables["p3"] := QuotedStr("單據號:" + VoucherNo);




  if warehouseno=3 then
  begin
    frxReport1.Variables["p8"] := QuotedStr("經手:");
    frxReport1.Variables["p4"] := QuotedStr("保管:");
    frxReport1.Variables["p5"] := QuotedStr("負責人:");
  end
  else
  begin
    frxReport1.Variables["p8"] := QuotedStr("采購:");
    frxReport1.Variables["p4"] := QuotedStr("驗收:");
    frxReport1.Variables["p5"] := QuotedStr("科室簽字:");
  end;
  frxReport1.Variables["p6"] := QuotedStr("操作員:"+Operator);
  frxReport1.Variables["p7"] := QuotedStr("打印日期:" + prDate);
  frxReport1.Variables["p10"] := QuotedStr("("+ShareGlobalVar.GlobalVar.GetUnitID+")");
  if IsPreView then
  begin
    frxReport1.ShowReport;
  end
  else
  begin
    frxReport1.PrintOptions.ShowDialog := False;
    frxReport1.PrepareReport();
    frxReport1.Print;
  end;
end;


 

在FastReport寫入代碼

procedure ColumnFooter1OnBeforePrint(Sender: TfrxComponent);
var
  bVisible: boolean;                                                         
begin
  bVisible := <Page> = <pageQ>;
  Memo12.visible := bVisible;
  Memo21.visible := bVisible;
  Memo16.visible := bVisible;
  Memo14.visible := bVisible;      
  if not bvisible then
  begin              
    p8.Top := 27;
    p7.Top := 27;        
    p4.Top :=  27;
    p5.Top :=  27;
    p6.Top :=  27;        
  end
  else
  begin
    p8.Top := 49.46;
    p7.Top := 49.46;        
    p4.Top :=  49.46;
    p5.Top :=  49.46;
    p6.Top :=  49.46;      
  end;                      
end;




procedure Page1OnBeforePrint(Sender: TfrxComponent);
var
  bVisible: boolean;                                                         
begin
  bVisible := <Page> = <pageQ>;
  if not bvisible then
  begin              
    ColumnFooter1.Height:=48;
  end
  else
  begin
    ColumnFooter1.Height:=69.35;
   end;
end;




begin




end.

 

 

7.加入自定義函數

 

(1)在delphi程序中定義函數

  frxReport1.AddFunction("function MoneyCn(mmje: Double): String;","Myfunction","小寫金額轉大寫的函數");
  frxReport1.OnUserFunction :=frxUserFunction;

 

 

(2)在frxUserFunction事件中加載函數

function TFunComm.frxUserFunction(const MethodName: string;
  var Params: Variant): Variant;
begin
  if UpperCase(MethodName) = UpperCase("MoneyCn") then
    Result := MoneyCn(Params[0]);
end;

 

(3)實現函數(數字轉大寫)

function MoneyCn(mmje: Double): string;
const
  s1: string = "零壹貳叄肆伍陸柒捌玖";
  s2: string = "分角元拾佰仟萬拾佰仟億拾佰仟萬";




  function StrTran(const S, s1, s2: string): string;
  begin
    Result := StringReplace(S, s1, s2, [rfReplaceAll]);
  end;
var
  S, dx: string;
  i, Len: Integer;
begin
  if mmje < 0 then
  begin
    dx := "負";
    mmje := -mmje;
  end;
  S := Format("%.0f", [mmje * 100]);
  Len := Length(S);
  for i := 1 to Len do
    dx := dx + Copy(s1, (Ord(S[i]) - Ord("0")) * 2 + 1, 2) + Copy(s2, (Len - i)
      * 2 + 1, 2);
  dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, "零仟", "零"), "零佰",
    "零"),
    "零拾", "零"), "零角", "零"), "零分", "整");
  dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, "零零", "零"), "零零",
    "零"),
    "零億", "億"), "零萬", "萬"), "零元", "元");
  if dx = "整" then
    Result := "零元整"
  else
    Result := StrTran(StrTran(dx, "億萬", "億零"), "零整", "整");
end;

(4) FastReport中引用函數

 

如:[MoneyCn(<SUM(<frxDBDataset1."M3">,MasterData1,2)>)]





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM