zoukankan      html  css  js  c++  java
  • 动态创建Fastreport

    动态创建Fastreport分以下几个步骤:

    1.首先清空Fastreport,定义全局变量,并加载数据集
       frReport.Clear;
       frReport.DataSets.Add(frxDBDataset1);
       DataHeight :=28;
       DataWidth :=80;
       FirstTop := 50;
       FirstLeft := 15;

    2.创建frxReportPage,并设置纸张大小
      Page := TfrxReportPage.Create(frReport);
      Page.CreateUniqueName;
      page.Orientation := poLandscape;
      Page.SetDefaults;  //默认大小
      //Page.PaperWidth := 210;
      //Page.PaperHeight := 297;

      //以下为动态设置纸张大小

      {if (qryPrn.FieldCount-4)<=6 then   //当列小于6
      begin
        Page.PaperWidth := 210;
        Page.PaperHeight := 279.4;
        page.Orientation := poPortrait;
      end
      else
      begin
        page.Orientation := poLandscape;
        iWidth := 40+85+90+(qryPrn.FieldCount-4)*84+30;

        //fr01cm=3.77953;
        if iWidth<297*fr01cm then  

        //fr01cm为frxClass中定义的常量,为每毫米像素值,或PerMillPix :=     25.38/Screen.PixelsPerInch;(25.38为每英寸毫米数)
        begin
          Page.PaperSize :=DMPAPER_A4;   //设置为A4,因为激光打印机不支持自定义纸张的横打
        end
        else
        begin
          Page.PaperWidth :=iWidth/fr01cm;
          Page.PaperHeight := 210;
        end;
      end;}
     
    3.生成PageBand,并指定高度
      Band := TfrxPageHeader.Create(Page);        //页首
      Band.Top := 10;
      Band.Height := 150;
     
      BandFoot := TfrxColumnFooter.Create(Page);   //页脚
      BandFoot.Top := 10;
      BandFoot.Height := 50;
     
    4.画页脚栏
      //画操作员
      memFoot := TfrxMemoView.Create(BandFoot);
      with memFoot do
      begin
        CreateUniqueName;
        HAlign := haLeft;
        VAlign := vaCenter;
        Memo.Text := '操作员:程序员';
        SetBounds(40, 10, 150, 20);
        ParentFont := False;
        Font.Name := '宋体';
        Font.Size := 10;
      end;

      //画打印时间
      memFoot := TfrxMemoView.Create(BandFoot);
      with memFoot do
      begin
        CreateUniqueName;
        Align := baLeft;
        HAlign := haLeft;
        VAlign := vaCenter;
        Memo.Text := '打印时间:' + FormatDateTime('yyyy-mm-dd hh:mm:ss', Now);
        SetBounds(280, 10, 270, 20);
        ParentFont := False;
        Font.Name := '宋体';
        Font.Size := 11;
      end;
     
    5.画标题栏
      //画标题
      Memo := TfrxMemoView.Create(Band);
      with Memo do
      begin
        CreateUniqueName;
        Align := baCenter;
        Memo.Text := '******余额汇总表';
        Frame.Typ :=[ftBottom];
        Frame.BottomLine.Style :=fsDouble;   //行类型
        Top := FirstTop;
        Height := 30;
        AutoWidth :=True;
        HAlign := haCenter;
        ParentFont := False;
        Font.Name := '黑体';
        Font.Size := 16;
      end; 
     
      //画单位
      Memo := TfrxMemoView.Create(Band);
      with Memo do
      begin
        CreateUniqueName;
        HAlign := haLeft;
        VAlign := vaCenter;
        Memo.Text := '单位:************';
        FirstTop := FirstTop + 40;
        FirstWidth := 200;
        FirstHeight := 30;
        SetBounds(40, FirstTop, FirstWidth, FirstHeight);
        ParentFont := False;
        Font.Name := '宋体';
        Font.Size := 10;
      end;

      //画日期
      Memo := TfrxMemoView.Create(Band);
      with Memo do
      begin
        CreateUniqueName;
        Align := baLeft;
        VAlign := vaCenter;
        HAlign := haLeft;
        Memo.Text := '日期:' + FormatDateTime('yyyy-mm-dd', Date);
        FirstWidth := 10 + FirstWidth + 200;
        FirstLeft := FirstLeft + FirstWidth;
        SetBounds(FirstLeft, FirstTop, 200, FirstHeight);
        ParentFont := False;
        Font.Name := '宋体';
        Font.Size := 10;
      end;

      //画页码
      Memo := TfrxMemoView.Create(Band);
      with Memo do
      begin
        CreateUniqueName;
        Align := baLeft;
        HAlign := haLeft;
        VAlign := vaCenter;
        Memo.Text := '第[Page#]/[TotalPages#]页';     //[]中括起来的是FastReport系统变量
        FirstWidth := 10 + FirstWidth;
        FirstLeft := FirstLeft + 200;
        SetBounds(FirstLeft, FirstTop, 100, FirstHeight);
        HAlign := haCenter;
        ParentFont := False;
        Font.Name := '宋体';
        Font.Size := 10;
      end; 
     
      for i := 1 to qryPrn.FieldCount - 4 do
      begin
        //画数据集的标题
        Memo := TfrxMemoView.Create(Band);
        Memo.CreateUniqueName;
        Memo.ParentFont := False;
        Memo.Font.Name := '宋体';
        Memo.Font.Size := 10;
        Memo.Text := qryPrn.Fields[i + 3].FieldName;
        Memo.Frame.Typ := [ftTop, ftBottom, ftRight];
        Memo.SetBounds(220 + (i - 1) * DataWidth, Band.Height - DataHeight, DataWidth, DataHeight);
        Memo.HAlign := haCenter;
        Memo.VAlign := vaCenter;
      end;
     
    6.画数据集
      DataBand := TfrxMasterData.Create(Page);
      DataBand.CreateUniqueName;
      DataBand.DataSet := frxDBDataset1;
      DataBand.Top := 200;
      DataBand.Height := DataHeight;

      Memo1 := TfrxMemoView.Create(DataBand);
      with Memo1 do
      begin
        CreateUniqueName;
        ParentFont := False;
        SetBounds(30, 0, 90, DataHeight);
        VAlign := vaCenter;
        HAlign := haLeft;
        Font.Name := '宋体';
        Font.Size := 10;
        DataSet := frxDBDataset1;
        DataField := 'locus';
        Frame.Typ := [ftRight, ftBottom, ftLeft];
      end;

      Memo1 := TfrxMemoView.Create(DataBand);  
      with Memo1 do
      begin
        CreateUniqueName;
        ParentFont := False;
        SetBounds(120, 0, 100, DataHeight);
        VAlign := vaCenter;
        HAlign := haRight;
        Font.Name := '宋体';
        Font.Size := 10;
        DataSet := frxDBDataset1;
        DataField := 'TotalMoney';
        Frame.Typ := [ftRight, ftBottom];     //加上右边和底部的边框
      end;

      for i := 1 to qryPrn.FieldCount - 4 do
      begin
        Memo1 := TfrxMemoView.Create(DataBand);
        Memo1.CreateUniqueName;
        Memo1.ParentFont := False;
        Memo1.SetBounds(220 + (i - 1) * DataWidth, 0, DataWidth, DataHeight);
        Memo1.DisplayFormat.DecimalSeparator := '.';
        //Memo1.ExpressionDelimiters := ',';
        //Memo1.DisplayFormat.FormatStr := '%2.2f';  定义显示格式
        //Memo1.DisplayFormat.Kind := fkNumeric;
        Memo1.VAlign := vaCenter;
        Memo1.HAlign := haRight;
        Memo1.Font.Name := '宋体';
        Memo1.Font.Size := 10;
        Memo1.DataSet := frxDBDataset1;
        Memo1.DataField := qryPrn.Fields[i + 3].FieldName;
        Memo1.Frame.Typ := [ftRight, ftBottom];
      end; 
     
    7.显示
      frReport.PrepareReport();
      frReport.ShowReport(); 
     

    8.将以上代码用函数表示

    (1)定义

    TBandType=(PageHeader,PageFooter);

    procedure CreatePage(var           Page:TfrxReportPage;frxReport:TfrxReport;iWidth,iHeight:Double;pDirect:TPrinterOrientation);
    procedure CreateBand(var band:TfrxBand;Page:TfrxReportPage;iTop,iHeight:Double;BandType:TBandType);
        procedure CreateDataBand(var band:TfrxMasterData;Page:TfrxReportPage;DbSet:TfrxDBDataset;iTop,iHeight:Integer);
        procedure CreateMemoData(var memView: TfrxMemoView; Band: TfrxBand;
          iLeft, iTop, iWidth, iHeight: Extended; fontname: string; fontsize: Integer;
          Halign: TfrxHAlign; Valign: TfrxVAlign; frxData: TfrxDBDataset; DField: string;
          FrameType: TfrxFrameTypes; Delimiters, ForStr: string; fkKind: TfrxFormatKind);
        procedure CreateMemo(var memView: TfrxMemoView; Band: TfrxBand;
          iLeft, iTop, iWidth, iHeight: Extended; fontname: string; fontsize: Integer;
          Halign: TfrxHAlign; Valign: TfrxVAlign; FrameType: TfrxFrameTypes; sText: string);

    (2)实现

    procedure TForm1.CreatePage(var Page: TfrxReportPage;
      frxReport: TfrxReport; iWidth, iHeight: Double;
      pDirect: TPrinterOrientation);
    begin
      Page := TfrxReportPage.Create(frxReport);
      Page.CreateUniqueName;
      Page.PaperWidth :=iWidth;
      Page.Height :=iHeight;
      Page.Orientation :=pDirect;
    end; 

    procedure TForm1.CreateBand(var band: TfrxBand; Page: TfrxReportPage; iTop,
      iHeight:Double;BandType:TBandType);
    begin
      case BandType of
        PageHeader: band :=TfrxPageHeader.Create(Page);
        PageFooter: band :=TfrxPageFooter.Create(Page);
      end;
      band.CreateUniqueName;
      band.Top :=iTop;
      band.Height :=iHeight;
    end;

    procedure TForm1.CreateDataBand(var band: TfrxMasterData;
      Page: TfrxReportPage; DbSet: TfrxDBDataset; iTop, iHeight: Integer);
    begin
      band :=TfrxMasterData.Create(Page);
      band.CreateUniqueName;
      band.DataSet := DbSet;
      band.Top :=iTop;
      band.Height :=iHeight;
    end;

    procedure TForm1.CreateMemo(var memView: TfrxMemoView; Band: TfrxBand;
      iLeft, iTop, iWidth, iHeight: Extended; fontname: string;
      fontsize: Integer; Halign: TfrxHAlign; Valign: TfrxVAlign;
      FrameType: TfrxFrameTypes; sText: string);
    begin
      memView := TfrxMemoView.Create(Band);
      memView.CreateUniqueName;
      memView.ParentFont := False;
      memView.Font.Name := fontname;
      memView.Font.Size := fontsize;
      memView.SetBounds(iLeft, iTop, iWidth, iHeight);
      memView.HAlign := Halign;
      memView.VAlign := Valign;
      memView.Frame.Typ := FrameType;
      memView.Memo.Text := sText;
    end;

    procedure TForm1.CreateMemoData(var memView: TfrxMemoView; Band: TfrxBand;
      iLeft, iTop, iWidth, iHeight: Extended; fontname: string;
      fontsize: Integer; Halign: TfrxHAlign; Valign: TfrxVAlign;
      frxData: TfrxDBDataset; DField: string; FrameType: TfrxFrameTypes;
      Delimiters, ForStr: string; fkKind: TfrxFormatKind);
    begin
      memView := TfrxMemoView.Create(Band);
      memView.CreateUniqueName;
      memView.ParentFont := False;
      memView.Font.Name := fontname;
      memView.Font.Size := fontsize;
      memView.SetBounds(iLeft, iTop, iWidth, iHeight);
      memView.HAlign := Halign;
      memView.VAlign := Valign;
      memView.DataSet := frxData;
      memView.DataField := DField;
      memView.Frame.Typ := FrameType;
      memView.ExpressionDelimiters := Delimiters;
      memView.DisplayFormat.FormatStr := ForStr;
      memView.DisplayFormat.Kind := fkKind;
    end;

    (3)引用代码

    const
      arrFields:array[1..12,1..2] of string=(('Quantity_Start','数量'),('Expense_Start','金额'),
        ('Quantity_Buy_Add','数量'),('Quantity_Buy_Add','金额'),
        ('Quantity_Other_Add','数量'),('Expense_Other_Add','金额'),
        ('Quantity_Out_Reduce','数量'),('Expense_Out_Reduce','金额'),
        ('Quantity_Other_Reduce','数量'),('Expense_Other_Reduce','金额'),
        ('Quantity_End','数量'),('Expense_End','金额')
        );

    var
      FirstTop, FirstWidth, FirstHeight, i, DataWidth, DataHeight, MlWidth: Integer;
      Page: TfrxReportPage;
      BandHeader, BandFoot: TfrxBand;
      DataBand: TfrxMasterData;
      Memo, Memo1, memFoot: TfrxMemoView;
      iLeft, iWidth, iLeft1: Integer;
      PerMillPix: Double;
      iFont: Integer;
      haAl: TfrxHAlign;
      MemArray: array[0..4] of TfrxMemoView;
      MemArray1, MemDataArray: array[0..12] of TfrxMemoView;
      MemArray2, MemArray3: array[0..3] of TfrxMemoView;
      frx:TfrxComponent;
    begin
      frReport.Clear;
      iFont := iFont10;
      frxDBDataset1.DataSet := qryPrn;
      frReport.DataSets.Add(frxDBDataset1);
      CreatePage(Page, frReport, 210, 279.4, poLandscape);

      //fr01cm :=3.77953;
      DataHeight := 25; //DataHeight*3为栏首高度(目录高度)
      MlWidth := 84; //目录宽度
      DataWidth := 40;
      FirstTop := 40;
      FirstHeight := 30;
      iLeft := 60;
      iLeft1 := 40;

      CreateBand(BandHeader, Page, 10, 220, PageHeader);
      CreateBand(BandFoot, Page, 10, 50, PageFooter);

      //画操作员
      CreateMemo(memFoot, BandFoot, 65, 10, 150, 20, FName, iFont, haLeft, vaCenter,
        [], '操作员:'+IGlobalVar.GetUserName);
      //画打印时间
      CreateMemo(memFoot, BandFoot, 280, 10, 270, 20, FName, iFont, haLeft, vaCenter,
        [], '打印时间:' + FormatDateTime('yyyy-mm-dd hh:mm:ss', Now));

      //画标题
      Memo := TfrxMemoView.Create(BandHeader);
      with Memo do
      begin
        CreateUniqueName;
        Align := baCenter;
        Memo.Text := '**********汇总表';
        Frame.Typ := [ftBottom];
        Frame.BottomLine.Style := fsDouble;
        Top := FirstTop;
        Height := 24;
        AutoWidth := True;
        HAlign := haCenter;
        ParentFont := False;
        Font.Name := '黑体';
        Font.Size := 16;
      end;

      //画单位
      FirstTop := FirstTop + 40;
      FirstWidth := 150;
      CreateMemo(MemArray[0], BandHeader, 65, FirstTop, FirstWidth, FirstHeight, FName, iFont, haLeft,
        vaCenter,
        [], '单位:'+IGlobalVar.GetUnitID);

      //画日期
      CreateMemo(MemArray[1], BandHeader, 128, MemArray[0].Top,
        270, FirstHeight, FName, iFont, haLeft, vaCenter,
        [], '日期:' + FormatDateTime('yyyy年mm月dd日', Date) + '至' +
        FormatDateTime('yyyy年mm月dd日', Date));

      //画仓库
      FirstWidth := 170;
      CreateMemo(MemArray[2], BandHeader, MemArray[0].Left, MemArray[0].Top + 20, FirstWidth,
        FirstHeight, FName, iFont, haLeft, vaCenter,
        [], '仓库:'+LcbWh.Text);

      //画分类方法
      FirstWidth := 10 + FirstWidth;
      CreateMemo(MemArray[3], BandHeader, MemArray[1].Left, MemArray[2].Top, 200, FirstHeight, '宋体',
        iFont, haLeft, vaCenter,
        [], '分类方法:'+lcb1.Text);

      //画页码
      FirstWidth := 10 + FirstWidth;
      CreateMemo(MemArray[4], BandHeader, MemArray[3].Left + MemArray[3].Width + 100, MemArray[2].Top,
        100, FirstHeight, FName, iFont, haLeft, vaCenter,
        [], '第[Page#]页 共[TotalPages#]页');

      //画栏标题
      iWidth := 32 * Pix10; //14个汉字(28字符)所用的像素值
      CreateMemo(MemArray1[0], BandHeader, iLeft, BandHeader.Height - DataHeight * 3, iWidth, DataHeight
        * 3, FName, iFont,
        haCenter, vaCenter, [ftTop, ftRight, ftBottom, ftLeft], '目录');
      iLeft := iLeft + iWidth;
      for i := 1 to 12 do
      begin
        if (i = 1) or (i = 2) or (i = 11) or (i = 12) then
          CreateMemo(MemArray1[i], BandHeader, MemArray1[i - 1].Left + MemArray1[i - 1].Width,
            BandHeader.Height -
            DataHeight * 2, GetWidth(i),
            DataHeight * 2,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], arrFields[i, 2])
        else
          CreateMemo(MemArray1[i], BandHeader, MemArray1[i - 1].Left + MemArray1[i - 1].Width,
            BandHeader.Height -
            DataHeight, GetWidth(i),
            DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], arrFields[i, 2]);
      end;
      CreateMemo(Memo, BandHeader, MemArray1[3].Left,MemArray1[1].Top,
         MemArray1[3].Width+MemArray1[4].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '外购');
      CreateMemo(Memo, BandHeader, MemArray1[5].Left,MemArray1[1].Top,
         MemArray1[5].Width+MemArray1[6].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '其它');
      CreateMemo(Memo, BandHeader, MemArray1[7].Left,MemArray1[1].Top,
         MemArray1[7].Width+MemArray1[8].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '报废');
      CreateMemo(Memo, BandHeader, MemArray1[9].Left,MemArray1[1].Top,
         MemArray1[9].Width+MemArray1[10].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '其它');

      CreateMemo(Memo, BandHeader, MemArray1[1].Left,MemArray1[0].Top,
         MemArray1[1].Width+MemArray1[2].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '期初余额');
      CreateMemo(Memo, BandHeader, MemArray1[3].Left,MemArray1[0].Top,
         MemArray1[3].Width+MemArray1[4].Width+MemArray1[5].Width+MemArray1[6].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '本期增加');
      CreateMemo(Memo, BandHeader, MemArray1[7].Left,MemArray1[0].Top,
         MemArray1[7].Width+MemArray1[8].Width+MemArray1[9].Width+MemArray1[10].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '本期减少');
      CreateMemo(Memo, BandHeader, MemArray1[11].Left,MemArray1[0].Top,
         MemArray1[11].Width+MemArray1[12].Width,DataHeight,
            FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], '期末余额');

      CreateDataBand(DataBand, Page, frxDBDataset1, 200, DataHeight);
      iWidth := 85;
      CreateMemoData(MemDataArray[0], DataBand, MemArray1[0].Left, 0, MemArray1[0].Width, DataHeight,
        FName, iFont, haLeft, vaCenter,
        frxDBDataset1, 'contents', [ftRight, ftBottom, ftLeft], '', '', fkText);
      frReport.Script.Clear;
      frReport.ScriptLanguage :='PascalScript';
      frReport.ScriptText.LoadFromFile('C:fr_script.pas');         
      MemDataArray[0].OnBeforePrint :='MemoOnBeforePrint';    //动态定义OnBeforePrint事件

      iLeft1 := iLeft1 + iWidth;
      for i := 1 to 12 do
      begin
        if Odd(i) then
          CreateMemoData(MemDataArray[i], DataBand, MemArray1[i].Left, 0, MemArray1[i].Width,
            DataHeight,
            FName, iFont, haCenter, vaCenter, frxDBDataset1, arrFields[i, 1],
            [ftRight, ftBottom], '', '', fkText)
        else
          CreateMemoData(MemDataArray[i], DataBand, MemArray1[i].Left, 0, MemArray1[i].Width,
            DataHeight,
            FName, iFont, haRight, vaCenter, frxDBDataset1, arrFields[i, 1],
            [ftRight, ftBottom], ',', '%2.2n', fkNumeric);
      end;
      frReport.PrepareReport();
      frReport.ShowReport();
    end;

    C:fr_script.pas中写入脚本

    procedure MemoOnBeforePrint(Sender: TfrxComponent);
    begin
      if Length(TfrxMemoView(Sender).Memo.Text)>10 then
      begin             
        TfrxMemoView(Sender).Memo.Text :=Trim(TfrxMemoView(Sender).Memo.Text);
        TfrxMemoView(Sender).HAlign :=haLeft; 
        //TfrxMemoView(Sender).VAlign :=VaTop;                                  
      end;
    end;

    begin

    end.

  • 相关阅读:
    在一个类中写完多线程(sleep 方法和wait 方法的区别)
    final
    Oracle 远程访问配置
    在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标
    C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
    C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper
    『.NET Core CLI工具文档』(十四)dotnet-install 脚本参考
    『.NET Core CLI工具文档』(十三)dotnet-publish
    『.NET Core CLI工具文档』(十二)dotnet-pack
    『.NET Core CLI工具文档』(十一)dotnet-test
  • 原文地址:https://www.cnblogs.com/shsgl/p/4070426.html
Copyright © 2011-2022 走看看