送分啦:DBGRID中的表列是动态创建的,如何实现它的打印呢?急急急(100分)

  • 主题发起人 主题发起人 flyingboat
  • 开始时间 开始时间
F

flyingboat

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGRID中的表列是动态创建的,如何实现它的打印呢?
用QReport可以吗,或者有什么其它控件吗?
我的EMail是:flyingboat@263.net,
请各位指教!
 
flyingboat: 我是自己写代码打印的。下面的代码时打印一页。
主调程序负责初始化xdpi,ydpi(打印机的水平和垂直分辨率),
Printer.begin
Doc
Printer.Title := '呵呵';
for i := startpage to endpagedo
begin
PrintOnePage(i);
if not endpage then
Printer.Newpage
end;
Printer.EndDoc;
支持页眉和页脚,参考参考吧:)
procedure PrintOnePage(pgno: Integer);
var
i, j: Integer;
ltp: Integer;
gw, gh: Integer;
sx, sy: Integer;
yh, yf: Integer;
TmpStr: String;
begin
with Printer, Printer.Canvasdo
begin
if pgno=PageCnt then
ltp := RcdCnt mod LineCnt//LineCnt为主调程序算出每页能达到少行
else
ltp := LineCnt;//决定每页该打多少条记录
if ltp=0 then
ltp := LineCnt;
gw := Round(593/96*xdpi);//报表输出宽度
gh := Round(20/96*(ltp+1)*ydpi);//报表输出高度
sx := (PageWidth - gw) div 2;//居中
sy := Round(MainForm.MarginTop/254*ydpi);//左边距
yh := Round(MainForm.MarginHead/254*ydpi);//页眉距
yf := Round(MainForm.MarginFoot/254*ydpi);//页脚距
Pen.Width := Round(xdpi/48);//线粗
Brush.Style := bsSolid;
Rectangle(sx,sy,sx+gw+1,sy+gh+Pen.Width);//报表外框
Pen.Width := Round(xdpi/96);
for i := 1 to ltpdo
begin
MoveTo(sx,sy+Round(i*20/96*ydpi));
LineTo(sx+gw,sy+Round(i*20/96*ydpi));
end;
//报表每行分割线
for i := 1 to 7do
begin
MoveTo(sx+Round(xPos/96*xdpi),sy);
LineTo(sx+Round(xPos/96*xdpi),sy+gh);
end;
//报表每列分割线
SetBkMode(Handle,TRANSPARENT);//透明模式
Font.Name := MainForm.HeadFont;
Font.Size := 15;
i := TextWidth(TitleStr);
TextOut(sx+(gw-i)div 2,yh,TitleStr);//输出页眉
Font.Name := MainForm.TextFont;
Font.Size := 9;
for i := 0 to 7do
TextOut(sx+Round((xPos+2)/96*xdpi),
sy+Round(5/96*ydpi),
DataModule1.Table1.Fields.DisplayLabel);//输出报表字段
DataModule1.Table1.First;
DataModule1.Table1.MoveBy((pgno-1)*LineCnt);
for j := 1 to ltpdo
begin
for i := 0 to 7do
TextOut(sx+Round((xPos+2)/96*xdpi),
sy+Round(j*20/96*ydpi)+Round(5/96*ydpi),
DataModule1.Table1.Fields.AsString);
DataModule1.Table1.Next;
end;
//输出该页的记录
Font.Name := MainForm.FootFont;
Font.Size := 8;
TmpStr := Format('第%d页',[pgno]);
i := TextWidth(TmpStr);
j := TextHeight(TmpStr);
TextOut(sx+(gw-i)div 2,PageHeight-yf-j,TmpStr);//输出页脚
end;
end;

 
这样好象没有打印预览功能,而且不太好控制表格的大小位置等,
有更好一些的方法吗?有没有这种构件呢?
另外,像QReport,Report Build,Crystal Report等这些报表工具
是不是都没有这种动态生成表列的功能呢?
 
不妨试试:
(1)打印时按实际需要由用户选择需打印的字段
(2)用QUERY对象存取相应的SQL。TEXT
(3)QREPORT与该QUERY绑定
(4)对于列宽,通过QUERY的有关属性可以取出字段值的长度,
再与字段的标识长度比较,取长者
(5)根据(4)可动态画出分割线
(6)代码不烦
(7)给分 ^_^
 
http://go.163.com/~hua8hua
download ehlib156
 
flyingboat:
打印预览功能我用一个TScrollBox和一个TImage完成的,和上面代码类似。
 

1、先在QuickRep设定所有字段的表格。
2、运行时在另一窗口中选定要显示的字段。
3、根据字段名的宽(或数据的最大宽), 确定QRShape,QRDBText,QRLabel的宽。及Left值。
没有选中的字段,QRShape,QRDBText,QRLabel宽为0。调整Left值。
4、还可以动态设定纸张大小等。效果更好。
代码不会太难,就是烦琐了点。我就是这样做的,试试吧!
 
用report machine嘛
http://rmachine.yeah.net
 
用GridEh的自带打印功能,能将GridEh中的内容打印出来,
还可由用户自行调整打印列宽,字体等。
完全可满足你的要求
 
多人接受答案了。
 
后退
顶部