⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tip35.htm

📁 对于学习很有帮助
💻 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>&nbsp;&nbsp;&nbsp; 看了贵报第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>    &nbsp;&nbsp;&nbsp; PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);<br>      PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);<br>    <br>    &nbsp;&nbsp;&nbsp;   //根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例 <br>    &nbsp;&nbsp;&nbsp; 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>    &nbsp;&nbsp;&nbsp;   printer.BeginDoc;<br>    &nbsp;&nbsp;&nbsp;   (DataSource1.DataSet).First;<br>    &nbsp;&nbsp;&nbsp;   while not (DataSource1.DataSet).Eof do<br>    &nbsp;&nbsp;&nbsp;   begin //打印DBGrid中的所有列<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    for i:=0 to DBGrid1.FieldCount-1 do<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    begin<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //假如所要打印的列超出了打印范围,则忽略该列<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   if     (x+DBGrid1.Columns.Items[i].Width*PointScale)〈=(Printer.PageWidth-PointX*RightBlank)     then<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    begin //画表格线<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //每页的第一行打印表头<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       Printer.Canvas.Rectangle(x,y,x+DBGrid1.Columns.Items[i].Width*PointScale,y+PrintStep); <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       if y=PointY*TopBlank then<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Columns[i].Title.Caption)<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    else<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Fields[i].asString);<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   end; //计算下一列的横坐标<br>    <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        x:=x+DBGrid1.Columns.Items[i].Width*PointScale;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   end;<br>    <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   if not (y=PointY*TopBlank) then <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DataSource1.DataSet).next;<br>    <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    x:=PointX*LeftBlank;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   y:=y+PrintStep; //换页<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   if (y+PrintStep)〉(Printer.PageHeight-PointY*BottomBlank)     then<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   begin<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    Printer.NewPage;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    y:=PointY*TopBlank;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    end;<br>    &nbsp;&nbsp;&nbsp;  &nbsp; end;<br>    <br>    &nbsp;&nbsp;&nbsp;  &nbsp; printer.EndDoc;<br>      &nbsp;&nbsp; (DataSource1.DataSet).First;<br>      &nbsp;&nbsp; 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 + -