我用的是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']));现在报表上已经有一些数据,我怎么确定页顶端到打印结尾的长度, 这样我好减减来求应该补充多少行谢谢大虾们了~~~~!!!!
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']));现在报表上已经有一些数据,我怎么确定页顶端到打印结尾的长度, 这样我好减减来求应该补充多少行谢谢大虾们了~~~~!!!!
看看fr的帮助和demo吧!
就算是用代码补空行。demo里面都有提供办法的。
先写标题表头,再一行行写数据,最后画表格线,全是FOR循环。
复杂一点的,根据实际情况如换行等,再仔细斟酌一下!从中可以学很多东西,如坐标转换、打印控制等等。
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;
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.
while freespace>(child1.height) do
showband(child1);
end