StringGrid 的直接打印! 请帮改一下!!!(100分)

  • 主题发起人 主题发起人 hefeng
  • 开始时间 开始时间
H

hefeng

Unregistered / Unconfirmed
GUEST, unregistred user!
function TDMGrade.LyqPrintStringGrid(frmMain: TForm;
sgdSchedule: TStringGrid; aTitle: String; bPreview: Boolean): Boolean;
var
i,j: Integer;
qrpPrint: TQuickRep;
aCell: TQRLabel;
aBand: TQRCustomBand;
localLeft: Integer;
aFieldTitle:TQRLabel;
begin
qrpPrint:=TQuickRep.Create(frmMain);
qrpPrint.PrintIfEmpty := True;
qrpPrint.Font.Name:='宋体';
qrpPrint.Font.Size:=12;
qrpPrint.Bands.HasColumnHeader:=True;
qrpPrint.Bands.HasTitle := True;
qrpPrint.Bands.HasDetail := True;
qrpPrint.Zoom:=60;
aBand := qrpPrint.Bands.DetailBand;

for i:=0 to sgdSchedule.RowCount-1 do
begin
aBand.HasChild := True;
aBand.Height:=sgdSchedule.RowHeights+1;
localLeft:=0;
for j:=0 to sgdSchedule.ColCount-1 do
begin
aCell:=TQRLabel.Create(aBand);
aCell.Parent:=aBand;
aCell.Caption:= sgdSchedule.Cells[j,i];

aCell.Height:=aBand.Height;
aCell.Alignment:=taLeftJustify;
aCell.AutoSize:=False;
aCell.Left:=localLeft;
aCell.Width:=sgdSchedule.ColWidths[j];
if j=0 then
begin
aCell.Frame.DrawLeft:=True;
LocalLeft:=LocalLeft+Round(1/qrpPrint.Zoom/100);
end
else aCell.Frame.DrawLeft:=False;
aCell.Frame.DrawBottom:=True;
aCell.Frame.DrawRight:=True;
LocalLeft:=LocalLeft+aCell.Width;
if j=0 then LocalLeft:=LocalLeft+1;
end;
aBand := aBand.ChildBand;
end;
aFieldTitle:=TQRLabel.Create(frmMain);
aFieldTitle.Parent:=qrpPrint.Bands.TitleBand;
aFieldTitle.Caption:=aTitle;
aFieldTitle.Frame.DrawBottom:=True;

aFieldTitle.AutoSize:=False;
aFieldTitle.AlignToBand:=False;
aFieldTitle.Left:= 1;
aFieldTitle.Height:= qrpPrint.Bands.TitleBand.Height;
aFieldTitle.Width := LocalLeft-1;
aFieldTitle.Alignment:=taCenter;
aFieldTitle.Top := 0;
aFieldTitle.Font.Name := '宋体';
aFieldTitle.Font.Size := 24;
if bPreView then
qrpPrint.Preview
else qrpPrint.Print;
end;

这是一个直接打印 StringGrid 的函数! 在StringGrid的内容较少时可以,但当 StringGrid 中的内容
超过一页就不能换页了,我不知道怎么做了,那位大侠帮改一下!!
或者有好的给一个!!!!

谢谢!!! mr-he@163.com
 
既然用的是stringgrid,干脆就用canvas直接画算了,想怎么打印就怎么打印!
 
to ego
说说怎么canvas 我是个低手!!
 
你这个是单页面输出,所以数据一多就不行了。请使用Printer.Canvas解决来的容易


换页使用Printer.NewPage;
 
你使用的是TQuickRep,这个东西有一个newpage方法,你可以在你循环中设定到达多少行后
分页。
 
我认为打印类似stringgrid这种比较规矩的表格,
用QuickRep直接设计好Detail Band(无须任何代码),
先将stringgrid内容转到临时表内,
再输出到QuickRep即可任意分页打印。
 
to samcrm,
怎么转,我们不让自己建表的,而且stringgrid的项目也不一定!
 
to windbell
说说怎么newpage 我这试了几次都不行!
 
改成如下如何:
没有代码所以我没有调试,你先试试只用红色部分行不行?如果不可以再用蓝色部分看看!
function TDMGrade.LyqPrintStringGrid(frmMain: TForm;
sgdSchedule: TStringGrid; aTitle: String; bPreview: Boolean): Boolean;

const
pageno:integer=25;

var
i,j: Integer;
qrpPrint: TQuickRep;
aCell: TQRLabel;
aBand: TQRCustomBand;
localLeft: Integer;
aFieldTitle:TQRLabel;
begin
qrpPrint:=TQuickRep.Create(frmMain);
qrpPrint.PrintIfEmpty := True;
qrpPrint.Font.Name:='宋体';
qrpPrint.Font.Size:=12;
qrpPrint.Bands.HasColumnHeader:=True;
qrpPrint.Bands.HasTitle := True;
qrpPrint.Bands.HasDetail := True;
qrpPrint.Zoom:=60;

[red] qrpPrint.page.width:=210;
qrpPrint.page.height:=297;[/red]

aBand := qrpPrint.Bands.DetailBand;

aFieldTitle:=TQRLabel.Create(frmMain);
aFieldTitle.Parent:=qrpPrint.Bands.TitleBand;
aFieldTitle.Caption:=aTitle;
aFieldTitle.Frame.DrawBottom:=True;

aFieldTitle.AutoSize:=False;
aFieldTitle.AlignToBand:=False;
aFieldTitle.Left:= 1;
aFieldTitle.Height:= qrpPrint.Bands.TitleBand.Height;
aFieldTitle.Width := LocalLeft-1;
aFieldTitle.Alignment:=taCenter;
aFieldTitle.Top := 0;
aFieldTitle.Font.Name := '宋体';
aFieldTitle.Font.Size := 24;


for i:=0 to sgdSchedule.RowCount-1 do
begin
aBand.HasChild := True;
aBand.Height:=sgdSchedule.RowHeights+1;
localLeft:=0;
for j:=0 to sgdSchedule.ColCount-1 do
begin
aCell:=TQRLabel.Create(aBand);
aCell.Parent:=aBand;
aCell.Caption:= sgdSchedule.Cells[j,i];
aCell.Height:=aBand.Height;
aCell.Alignment:=taLeftJustify;
aCell.AutoSize:=False;
aCell.Left:=localLeft;
aCell.Width:=sgdSchedule.ColWidths[j];
if j=0 then
begin
aCell.Frame.DrawLeft:=True;
LocalLeft:=LocalLeft+Round(1/qrpPrint.Zoom/100);
end
else aCell.Frame.DrawLeft:=False;
aCell.Frame.DrawBottom:=True;
aCell.Frame.DrawRight:=True;
LocalLeft:=LocalLeft+aCell.Width;
if j=0 then LocalLeft:=LocalLeft+1;
end;
aBand := aBand.ChildBand;

[blue] if (i mod pageno)=0 and i<>0 then
prpPrint.newpage;[/blue]

end;

if bPreView then
qrpPrint.Preview
else qrpPrint.Print;
end;
 
to windbell
你告诉我的方法不行,
  请帮忙!

 
你都试了吗?错在哪儿?
 
您说的方法根本就编译不过去!

好像 newpage放在那里也不对·
 
程序不大的话可以发过来调试一下看:
xzlzq@163.com
 
fw们,这个帖子还没有结!!

快来发表你的建议阿!!
 
接受答案了.
 
后退
顶部