动态创建Fastreport

    技术2022-05-19  19

    动态创建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.


    最新回复(0)