我用的是frReport,在打印的时候,有的就打半页就没记录了现在怎么才能按照主项数据的宽度,来一行一行补充,打满全页啊?如果这是空页,开始时可以确定要补充的行数,即:
PPCount:=trunc((frreport1.Pages[0].Prop['height']-
    integer(frreport1.Pages[0].Prop['topmargin'])-
    integer(frreport1.Pages[0].Prop['bottommargin'])-
    integer(frreport1.FindObject('页头').Prop['height'])-
    integer(frreport1.FindObject('栏目脚').Prop['height'])-
    integer(frreport1.FindObject('页脚').Prop['height'])) /
    integer(frreport1.FindObject('主项数据').Prop['height']));现在报表上已经有一些数据,我怎么确定页顶端到打印结尾的长度, 这样我好减减来求应该补充多少行谢谢大虾们了~~~~!!!!

解决方案 »

  1.   

    老大,footband是干什么的?
    看看fr的帮助和demo吧!
    就算是用代码补空行。demo里面都有提供办法的。
      

  2.   

    又一个Report傀儡,如果自己写这个打印代码可能很简单!
      

  3.   

    footband怎么用 大虾告诉我吧我现在就是想知道 我报表剩下多少空白的地方谢谢啦~~~!!!
      

  4.   

    简单的,如基本表格数据
    先写标题表头,再一行行写数据,最后画表格线,全是FOR循环。
    复杂一点的,根据实际情况如换行等,再仔细斟酌一下!从中可以学很多东西,如坐标转换、打印控制等等。
      

  5.   

    下面是我以前给朋友做的一个库存系统,调用者传过来一个ListView,该单元根据各列宽度按比例放缩到打印机当前设置的红纸张宽度页面内。该库存系统的库存信息、入库信息、出库信息、退货信息、返货信息、统计信息等都调用这个单元进行打印。
    unit UnitPrint;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls, Spin, ComCtrls, Printers;type
      TFormPrint = class(TForm)
        Panel1: TPanel;
        btnPrintSetting: TSpeedButton;
        btnInfoSetting: TSpeedButton;
        ScrollBox: TScrollBox;
        ImgCanvas: TImage;
        btnPrint: TSpeedButton;
        lblPages: TLabel;
        Label2: TLabel;
        seCurPage: TSpinEdit;
        PrinterSetupDialog: TPrinterSetupDialog;
        listView: TListView;
        procedure FormShow(Sender: TObject);
        procedure btnPrintSettingClick(Sender: TObject);
        procedure btnInfoSettingClick(Sender: TObject);
        procedure btnPrintClick(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure seCurPageChange(Sender: TObject);
      private
        { Private declarations }
        pixelsPerMM: single;          //每毫米象素数
        colWidths: array of single;   //列宽百分比
        function SetPage: boolean;
        procedure PrintData(canvas: TCanvas; curPage: integer);    procedure TextOut(canvas: TCanvas; x, y :single; s: string);
        procedure FillRect(canvas: TCanvas; l, t, r, b: single);
        procedure DrawLine(canvas: TCanvas; x1, y1, x2, y2: single);
      public
        { Public declarations }
        pageTitle: string;
        printDate: TDate;
        lv: TListView;
        leftMargin, rightMargin, topMargin, LineHeight, LinesPerPage: integer;
        lastPage: integer;
      end;var
      FormPrint: TFormPrint;
    implementationuses UnitTitleSetting;{$R *.dfm}{ TFormPrint }procedure TFormPrint.DrawLine(canvas: TCanvas; x1, y1, x2, y2: single);
    begin
      canvas.MoveTo(Round(x1 * pixelsPerMM), Round(y1 * pixelsPerMM));
      canvas.LineTo(Round(x2 * pixelsPerMM), Round(y2 * pixelsPerMM));
    end;procedure TFormPrint.FillRect(canvas: TCanvas; l, t, r, b: single);
    begin
      canvas.FillRect(Rect(Round(l * pixelsPerMM), Round(t * pixelsPerMM), Round(r * pixelsPerMM), Round(b * pixelsPerMM)));
    end;procedure TFormPrint.TextOut(canvas: TCanvas; x, y: single; s: string);
    begin
      canvas.TextOut(Round(x * pixelsPerMM), Round(y * pixelsPerMM), s);
    end;procedure TFormPrint.FormShow(Sender: TObject);
    var
      i, j, AllWidth: integer;
      li: TListItem;
      lc: TListColumn;
    begin
      leftMargin := 15;
      rightMargin := 15;
      topMargin := 15;
      LinesPerPage := 30;
      LineHeight := 8;
      AllWidth := 0;
      pixelsPerMM := 96 / 25.4;
      imgCanvas.Width := 793;
      imgCanvas.Height := 1123;
      lastPage := 1;
      // copy from lv to listView
      for j := 0 to lv.Columns.Count - 1 do
      begin
        if lv.Column[j].Width > 0 then
        begin
          lc := listView.Columns.Add;
          lc.Caption := lv.Column[j].Caption;
          lc.Width := lv.Column[j].Width;
          Inc(AllWidth, lc.Width);
        end;
      end;
      for i := 0 to lv.Items.Count - 1 do
      begin
        li := listView.Items.Add;
        for j := 0 to lv.Columns.Count - 1 do
        begin
          if lv.Column[j].Width > 0 then
          begin
            if j = 0 then
              li.SubItems.Add(lv.Items[i].Caption)
            else
              li.SubItems.Add(lv.Items[i].SubItems[j - 1]);
          end;
        end;
      end;
      SetLength(colWidths, listView.Columns.Count);
      for i := 0 to listView.Columns.Count - 1 do
      begin
        colWidths[i] := listView.Column[i].Width / AllWidth;
      end;
      // 计算页数
      lblPages.Caption := Format('共 %2d  页', [(listView.Items.Count + LinesPerPage - 1) div LinesPerPage]);
      seCurPage.MaxValue := (listView.Items.Count + LinesPerPage - 1) div LinesPerPage;
      PrintData(ImgCanvas.Canvas, 1);
    end;function TFormPrint.SetPage: boolean;
    var
      DevMode : TDeviceMode;
    begin
      Result := False;
      // 判断系统是否有默认的打印机
      if Printer = nil then
      begin
        Application.MessageBox('系统没有默认的打印机!', '提示', mb_OK + mb_IconInformation);
        Exit;
      end;
      if Printer.Printers.Count = 0 then
      begin
        Application.MessageBox('系统没有安装打印机!', '提示', mb_OK + mb_IconInformation);
        Exit;
      end;
      // 设置纸张暂用A4
      DevMode.dmFields := DevMode.dmFields or DM_PAPERSIZE;
      DevMode.dmPaperSize := DMPAPER_A4;
      //Printer.Orientation := poLandscape  // 横向
      Printer.Orientation := poPortrait;    // 纵向
      pixelsPerMM := GetDeviceCaps(Printer.Handle, LOGPIXELSX) / 25.4;
      Result := True;
    end;
      

  6.   

    接上帖:
    procedure TFormPrint.PrintData(canvas: TCanvas; curPage: integer);
    var
      yy, mm, dd: WORD;
      x, y: single;
      i, j: integer;
      startRow, endRow: integer;
      tmp : string;
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(canvas.ClipRect);  // 字体设置
      canvas.Font.Name := '宋体';
      canvas.Font.Size := 10;
      // 标题和日期
      canvas.Font.Name := '黑体';
      canvas.Font.Size := 16;
      canvas.Font.Style := [fsBold];
      y := topMargin;
      canvas.TextOut(Round(pixelsPerMM * 210 - canvas.TextWidth(pageTitle)) div 2, Round(y * pixelsPerMM), pageTitle);
      y := y + 10;
      canvas.Font.Size := 10;
      canvas.Font.Style := [];
      canvas.Font.Name := '宋体';
      DeCodeDate(printDate, yy, mm, dd);
      tmp := Format('打印日期:%d年%d月%d日', [yy, mm, dd]);
      canvas.TextOut(Round(pixelsPerMM * (210 - rightMargin) - canvas.TextWidth(tmp)), Round(y * pixelsPerMM), tmp);
      y := y + 7;
      tmp := Format('共%d页,第%d页', [seCurPage.MaxValue, curPage]);
      canvas.TextOut(Round(pixelsPerMM * (210 - rightMargin) - canvas.TextWidth(tmp)), Round((y + (LinesPerPage + 1) * LineHeight + 2) * pixelsPerMM), tmp);
      canvas.Brush.Color := clGray;
      FillRect(canvas, leftMargin, y, 210  - rightMargin, y + 8);
      // 表头
      canvas.Font.Style := [fsBold];
      x := leftMargin;
      for i := 0 to listView.Columns.Count - 1 do
      begin
        TextOut(canvas, x + 1, y + 4, listView.Column[i].Caption);
        DrawLine(canvas, x, y, x, y + LineHeight * (LinesPerPage + 1));
        x := x + colWidths[i] * (210  - rightMargin - leftMargin);
        if i = listView.Columns.Count - 1 then
          DrawLine(canvas, x, y, x, y + LineHeight * (LinesPerPage + 1));
      end;
      Canvas.Brush.Color := clWhite;
      y := y + LineHeight;
      startRow := (curPage - 1) * LinesPerPage;
      endRow := curPage * LinesPerPage - 1;
      if endRow >= listView.Items.Count then
        endRow := listView.Items.Count - 1;
      for i := 0 to endRow - startRow do
      begin
        x := leftMargin;
        for j := 0 to listView.Columns.Count - 1 do
        begin
          TextOut(canvas, x + 1, y + 4, listView.Items[startRow + i].SubItems[j]);
          x := x + colWidths[j] * (210  - rightMargin - leftMargin);
        end;
        y := y + LineHeight;
      end;
      for i := 0 to LinesPerPage + 1 do
      begin
        DrawLine(canvas, leftMargin, topMargin + 17 + i * LineHeight, 210 - rightMargin, topMargin + 17 + i * LineHeight);
      end;
    end;procedure TFormPrint.btnPrintSettingClick(Sender: TObject);
    begin
      // 判断系统是否有默认的打印机
      if Printer.Printers.Count = 0 then
      begin
        Application.MessageBox('系统没有安装打印机!', '提示', mb_OK + mb_IconInformation);
        Exit;
      end;
      // if not PrinterSetupDialog.Execute then Exit;
      Application.MessageBox('目前只支持A4纵向打印!', '提示', mb_OK + mb_IconInformation);
    end;procedure TFormPrint.btnInfoSettingClick(Sender: TObject);
    begin
      FormTitleSetting := TFormTitleSetting.Create(nil);
      FormTitleSetting.edtTitle.Text := pageTitle;
      FormTitleSetting.dtpDate.Date := printDate;
      FormTitleSetting.ShowModal;
      if FormTitleSetting.bModified then
      begin
        pageTitle := FormTitleSetting.edtTitle.Text;
        printDate := FormTitleSetting.dtpDate.Date;
        seCurPageChange(Sender);
      end;
      FormTitleSetting.Free;
    end;procedure TFormPrint.btnPrintClick(Sender: TObject);
    var
      i: integer;
    begin
      if not SetPage then Exit;
      Printer.BeginDoc;
      for i := 1 to seCurPage.MaxValue do
      begin
        if i > 1 then
          Printer.NewPage;
        PrintData(Printer.Canvas, i);
      end;
      Printer.EndDoc;
      pixelsPerMM := 96 / 25.4;
    end;procedure TFormPrint.FormResize(Sender: TObject);
    begin
      imgCanvas.Left := 0;
      imgCanvas.Top := 0;
      if imgCanvas.Width < ScrollBox.ClientWidth then
        imgCanvas.Left := (ScrollBox.ClientWidth - imgCanvas.Width) div 2;
    end;procedure TFormPrint.seCurPageChange(Sender: TObject);
    var
      page: integer;
    begin
      if seCurPage.Text = '' then Exit;
      try
        page := StrToInt(seCurPage.Text);
        if (page >= seCurPage.MinValue) and (page <= seCurPage.MaxValue) then
        begin
          PrintData(imgCanvas.Canvas, seCurPage.Value);
          lastPage := page;
        end else
          seCurPage.Value := lastPage;
      except
        seCurPage.Value := lastPage;
      end;
    end;end.
      

  7.   

    唉,现在的人真是越来越懒了,masterfooter的onbeforeprint里面加上下面的代码!begin
      while freespace>(child1.height) do
        showband(child1);
    end