📄 tip35.htm
字号:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>也谈为Delphi中数据库报表加网格</title></head><body background="../../Images/RainbowBkg.gif"><table border="0" width="100%" style="font-size: 9pt"> <tr> <td width="100%"><p align="center"><strong><big><font color="#99000">也谈为Delphi中数据库报表加网格</font></big></strong></p> <p> 看了贵报第63期《为Delphi 3.0中数据库报表加上网格线》一文,笔者发现原文中的程序在不同分辨率的打印机(如180dpi的针式打印机和600dpi的激光打印机)上打印表格,效果会完全不同。如作者以针打作为他的输出打印机设计的程序,在激光打印机上输出,就会发现表格和文字错位,而且表格会打印得很小。而且原文中打印坐标的确定,必须靠反复的试验才能达到比较满意的效果。<br> <br> 针对原目标,笔者设计了一段程序。首先在窗体上添加一个DBGrid来显示我们所要打印的数据,在这里,DBGrid不只是起到显示数据的作用,而且用户对DBGrid作的调整,例如改变了各字段的排列顺序,各字段的显示宽度等,都将直接反映到打印结果中去,也就是说,我们实际上就是要把DBGrid的内容直接输出到打印机。以下程序在Win 98+Delphi 4下编译通过,代码如下:<br> procedure TForm1.Button2Click(Sender: TObject);<br> const<br> LeftBlank=1; //定义页边距,单位厘米<br> RightBlank=1;<br> TopBlank=1;<br> BottomBlank=1;<br> var<br> PointX,PointY:integer;<br> PointScale,PrintStep:integer;<br> s:string;<br> x,y:integer;<br> i:integer;<br> begin //获取当前打印机的分辨率<br> PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);<br> PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);<br> <br> //根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例 <br> PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/Screen.PixelsPerInch+0.5); //横向打印<br> printer.Orientation:=poLandscape;<br> <br> //打印的字体和大小<br> printer.Canvas.Font.Name:=′宋体′;<br> printer.canvas.Font.Size:=10;<br> <br> //根据字体的大小确定每行的高度<br> s:=′漳州市刑警支队′;<br> PrintStep:=printer.canvas.TextHeight(s)+16;<br> <br> //打印的起点位置<br> x:=PointX*LeftBlank;<br> y:=PointY*TopBlank;<br> <br> //DataSource1是DBGrid1所连接的数据源<br> <br> if ((DataSource1.DataSet).Active=true) and ((DataSource1.DataSet).RecordCount〉0) then<br> begin<br> printer.BeginDoc;<br> (DataSource1.DataSet).First;<br> while not (DataSource1.DataSet).Eof do<br> begin //打印DBGrid中的所有列<br> for i:=0 to DBGrid1.FieldCount-1 do<br> begin<br> //假如所要打印的列超出了打印范围,则忽略该列<br> if (x+DBGrid1.Columns.Items[i].Width*PointScale)〈=(Printer.PageWidth-PointX*RightBlank) then<br> begin //画表格线<br> //每页的第一行打印表头<br> Printer.Canvas.Rectangle(x,y,x+DBGrid1.Columns.Items[i].Width*PointScale,y+PrintStep); <br> if y=PointY*TopBlank then<br> Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Columns[i].Title.Caption)<br> else<br> Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Fields[i].asString);<br> end; //计算下一列的横坐标<br> <br> x:=x+DBGrid1.Columns.Items[i].Width*PointScale;<br> end;<br> <br> if not (y=PointY*TopBlank) then <br> (DataSource1.DataSet).next;<br> <br> x:=PointX*LeftBlank;<br> y:=y+PrintStep; //换页<br> if (y+PrintStep)〉(Printer.PageHeight-PointY*BottomBlank) then<br> begin<br> Printer.NewPage;<br> y:=PointY*TopBlank;<br> end;<br> end;<br> <br> printer.EndDoc;<br> (DataSource1.DataSet).First;<br> Application.MessageBox(′打印完成′,′打印′,32);<br> end;<br> end;</p> <hr size="1"> <p align="center">中国计算机报社版权所有</td> </tr></table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -