如何把DBGrid中的数据打印出来?(200分)

  • 主题发起人 主题发起人 Thinboy
  • 开始时间 开始时间
RapidReport2.1,一组Delphi报表控件,核心基于"TDBGrid",适用Delphi5,Delphi6,Delphi7,C++Buidle5。
特点是:快速制表、减轻了报表编程的工作量、执行程序对用户操作报表来说是"灵活,有余地"。
功能:
1、超强设计期、运行期编辑能力,可以在设计期设计、调整报表格式,运行期调整报表格式和内容;
2、所见即所得的制表功能,符合国人使用习惯的标尺系统;报表格式定位精度0.1毫米;
3、 可以将报表格式输出到文件中保存;可以将报表输出为Excel文件保存;可以实现报表数据汇总功能;
4、控件内置预览功能,实现打印预览及打印输出的无级缩放;
5、完全适应各类型,各分辩率的打印机;有打印进纸微调接口(调整应用开发者测试用打印机与最终用户端打印机之间的进纸差异);
6、实现精确票据打印(见 Demo; 一般设属性 Visible = False, DataSource = nil, 即不使用数据库能力):借助于"DBR"报表格式文件,票据格式的变化只需重新分发(或用户编辑)相应的"DBR"格式文件,不影响用户程序。
下载地址:
中国电信1:
http://download.pchome.net/php/download2.php?sid=13339&url=/development/delphi/zRapidReport21.exe&svr=3
中国电信2:
http://download.pchome.net/php/download2.php?sid=13339&url=/development/delphi/zRapidReport21.exe&svr=4
中国电信3:
http://download.pchome.net/php/download2.php?sid=13339&url=/development/delphi/zRapidReport21.exe&svr=1
有线通1:
http://download.pchome.net/php/download2.php?sid=13339&url=/development/delphi/zRapidReport21.exe&svr=5
有线通2:
http://download.pchome.net/php/download2.php?sid=13339&url=/development/delphi/zRapidReport21.exe&svr=6
 
http://www.softreg.com.cn/shareware.asp?id=7495

reprint
使用说明
本人长期使用delphi做数据库的开发,报表控件使用Quickrpt,在打印上经常遇到一些问题,于是自己经常编写一部分打印的程序,经过总结开发了这个控件。
本控件可打印 datasource,dbgrid,stringgrid.
一 、控件属性:
1、colstitle 设置报表的列标题属性
(1)alignment 列标题对齐方式。
(2)font 列标题字体
(3)print 设置是否打印列标题
(4)rowspace 列标题行的高度
2、datasource 选择要打印的datasource
3、dbgrid 选择要打印的dbgrid
4、stringgrid 选择要打印的stringgrid
5、detail 设置要打印的明细数据属性
(1)arrange 设置明细字段排列方向
Horizontal 横向打印(默认的一般打印)
Vertical 竖向打印(字段竖向排列适合打印字段内容较长的报表如“会议纪录”)
(2)aotureturn 打印明细字段时,如果字段超过列的宽度是否允许自动换行
(3)colsline 设置竖线属性引用tpen类
(4)footer 设置明细尾
(5)frame 设置明细边框属性引用tpen类
(6)head 设置明细头同footer
(7)rowsline 设置横线属性引用tpen类
(8)rowspace 设置明细行的高度
(9)top 明细与标题的距离
6、page 设置纸张的上下左右边距
7、pagefooter 设置页脚同明细尾
8、pageheader 设置页眉同页脚
9、printobject 选择要打印的对象 (datasource 、dbgrid、 stringgrid )
10、title 设置标题类页眉、页脚
二 、控件方法:
(1) preview 预览
(2) print 打印
(3) SaveToFile() 保存为报表文件
(4) SaveToStream() 保存为流(然后就可把整个报表存到数据库了很方便哦! ~_~)
(5) PrintFile() 打印报表文件
(6) PrintStream() 打印流(流的数据库存取就不用多说了吧)
(7) PreviewFile() 预览文件
(8) PreviewStream() 预览流
(9) OptionToStream() 报表的属性保存为流
(10) OptionFromStream() 从流中得到报表属性
三、 控件事件:
AfterPrint 打印后
BeforePrint 打印前
(本来很多事件,但没有预览,后来加上预览以及一些方法后实现很困难就去掉了!)
四、注意事项
(1) text 属性,输入“|#|”打印页码值,如果想打印页码可输入“第|#|页” 输入“|RecordCount|”打印 记录数
(2) 不同的打印机,打印和预览效果可能有一点点不同(保证数据打印完全正确一致)。本人用一台针式和一台激光打印机做测试,开始差别较大后经过调试基本一致,不知其他打印机如何。
就这些个吧基本满足了我的软件开发需要,解决了很多问题,关键是做报表省了很大力气,当然了很复杂的报表还是要其它报表控件来解决。如果有其他问题或好的建议可与我联系。
程序设计:吴进昊
E-mail :jinhaowu@hotmail.com
qq :54254770
 
thinboy:
能不能联系我啊!有急事找你!
2000ddlp@sina.com
 
一天到晚游泳的瑜: 能否发送给我一份!万分谢谢!!!
yuanting7288@tom.com
 
procedure TForm1.Button2Click(Sender: TObject);
var
pl,pr,pt,pb:integer;//页边距
px,py:integer;//打印机分辨率
ps:integer;//打印机与显示器分辨率之比
lh:integer;//行高
i:integer;
x,y:integer;//打印坐标
rowb,colb:integer;
//行距、行距
begin
//初始化页面
pl:=spinedit1.Value;
pr:=spinedit2.Value;
pt:=spinedit3.Value;
pb:=spinedit4.Value;
rowb:=spinedit6.Value;//行距
colb:=spinedit7.Value;//列距
//将获得的打印机分辨率由厘米转换为英寸
px:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//将屏幕分辨率转换为打印机的比例 
ps:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)
/Screen.PixelsPerInch);
//设置打印方向
if combobox1.Text='横向打印' then
printer.Orientation:=poPortrait;
else
printer.Orientation:=poLandscape;
//获得打印的字体和大小
printer.Canvas.Font.Name:=combobox2.Text;
printer.canvas.Font.Size:=spinedit5.Value;
printer.canvas.Font.Color:=clred;
printer.Canvas.Pen.Color:=clblue;
//设置行高
lh:=printer.canvas.textheight(dbgrid1.Font.Name);
//打印的起始位置(打印机画布上的位置)
x:=PX*pl;
y:=PY*pt;
//打印DBGrid1中的内容
if (table1.Active=true) and (table1.RecordCount>0) then
begin
//设置一打印机任务标题
printer.Title:='DBGrid内容打印';
with printerdo
begin
begin
Doc;
table1.First;
while not table1.Eofdo
begin
for i:=0 to DBGrid1.FieldCount-1do
begin
//设定打印的宽度
if (x+DBGrid1.Columns.Items.Width*ps)
<=(PageWidth-ps*pr) then
begin
//画出表格线
Printer.Canvas.Rectangle(x,y,x+dbgrid1.Columns.Items.Width*ps,y+lh);
//如果为第一行时,打印DBGrid1确的标题
if y=PY*pt then
Canvas.TextOut(x+rowb,y+colb,
DBGrid1.Columns.Title.Caption)
else
//其它行,打印每行的内容
Printer.Canvas.TextOut(x+rowb,y+colb,
DBGrid1.Fields.asString);
end;
//下一列的横坐标,下一列的纵坐标不变
x:=x+dbgrid1.Columns.Items.Width*ps;
end;
//打印下一记录
if not (y=py*pt) then
table1.next;
x:=px*pl;
//打印下一行时,横坐标回到行首
y:=y+lh;
//打印满一页时,新建一页
if (y+lh)>(PageHeight-py*pb) then
begin
NewPage;
x:=px*pl;
y:=py*pt;
end;
end;
EndDoc;
end;
table1.First;//回到DBGrid1首行
Application.MessageBox('已打印完成','打印',32);
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
//获得打印可选字体,并设置初始字体为DBGrid1的字体,字号
combobox2.Items:=printer.Fonts;
combobox2.Text:=dbgrid1.Font.Name;
spinedit5.value:=dbgrid1.Font.Size;
table1.DatabaseName:=ExtractFilePath(Application.ExeName);
table1.open;
end;
end.
 
Thinboy
你有QQ或EMAIL没有呀?
我想问一下你的
"如何得到另一台机的打印输出数据?"这个问题
有答案了没有,
如果有,能把答案给我么?
(有什么要求请提.)
我找了很久了....
谢谢.
 
Thinboy
你有QQ或EMAIL没有呀?
我想问一下你的
"如何得到另一台机的打印输出数据?"这个问题
有答案了没有,
如果有,能把答案给我么?
(有什么要求请提.)
我找了很久了....
谢谢.
b_123@tom.com
qq:13823062
 
建议 1 , 导入到 excel
2 建议使用 dbGridEh 控件
 
这里应该有你需要的代码
http://www.delphibbs.com/keylife/iblog_show.asp?xid=4091
 
DBGridEh和PrintDBGridEh结合使用
 
但是用DBGridEh和PrintDBGridEh是可以很容易打印出dbgrid的内容,但报表的表头设计好像就不是很方便了,如果要加入图片什么的,该怎么办??
 
后退
顶部