delphi中打印TStringGrid

Delphi实现网格打印功能
此博客展示了用Delphi编写的打印网格的代码。代码中定义了页边距,获取打印机分辨率,设置字体和大小,能打印标题、日期和数据,还处理了表格线绘制、换页等情况,最后完成打印并给出提示信息。

procedure TFrmDTWater.PrintGrid(GenStrGrid: TStringGrid; sTitle: String);
const
  LeftBlank=1; //定义页边距,单位厘米
  RightBlank=1;
  TopBlank=2;
  BottomBlank=2;
var
  PointX,PointY:integer;
  PointScale,PrintStep:integer;
  s1,s2,s3:string;
  x,y:integer;
  i,k:integer;
begin
   //横向打印
  printer.Orientation:=poPortrait;
  if PrintDialog1.Execute then
  begin
     //获取当前打印机的分辨率
     PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
     PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);

      //根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例 
     PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)
                  /Screen.PixelsPerInch+0.5);

     //打印的字体和大小
     printer.Canvas.Font.Name:='宋体';
     printer.canvas.Font.Size:=16;
     printer.canvas.Font.Style:=[fsBold];

     //根据字体的大小确定每行的高度
     s1:=Ttl;
     PrintStep:=printer.canvas.TextHeight(s1)+16;

     //打印的起点位置
     x:=PointX*LeftBlank;
     y:=PointY*TopBlank;

     printer.BeginDoc;
     //打印标题
     x:=x+StringGrid1.DefaultColWidth*PointScale*2;
     Printer.Canvas.TextOut(x+8,y+8,s1);
     y:=y+PrintStep;
      //打印日期
     printer.Canvas.Font.Name:='宋体';
     printer.canvas.Font.Size:=12;
     printer.canvas.Font.Style := [];
     //根据字体的大小确定每行的高度
     s2:=FormatDateTime('yyyy-mm-dd',Date());
     PrintStep:=printer.canvas.TextHeight(s2)+20;
     x:=x+StringGrid1.DefaultColWidth*PointScale*3;
     Printer.Canvas.TextOut(x+8,y+8,s2);
     x:=PointX*LeftBlank;
     y:=y+PrintStep;
      ////打印数据
     k:=0;
     while k<=StringGrid1.RowCount do
     begin
        //打印中的所有列
       for i:=0 to StringGrid1.ColCount-1 do
       begin

         //假如所要打印的列超出了打印范围,则忽略该列
         if (x+StringGrid1.DefaultColWidth *PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
         begin

           //画表格线
           //每页的第一行打印表头
           if k=1 then
               printer.canvas.Font.Style:=[fsBold]
           else
                printer.canvas.Font.Style:=[];
           if k<>0 then
              Printer.Canvas.Rectangle(x,y,x+StringGrid1.DefaultColWidth
                                     *PointScale+200,y+PrintStep);
           if k<>0 then
              Printer.Canvas.TextOut(x+8,y+8,StringGrid1.Cells[i,k]);
         end;

         //计算下一列的横坐标
         x:=x+StringGrid1.DefaultColWidth*PointScale+200;
       end;
       {if not (y=PointY*TopBlank) then
          k:=k+1;}
       x:=PointX*LeftBlank;
       y:=y+PrintStep;
       //换页
       if (y+PrintStep)>(Printer.PageHeight-PointY*BottomBlank) then
       begin
         Printer.NewPage;
         y:=PointY*TopBlank;
       end;
       k:=k+1;
     end;
     //打印结尾字体和大小
     printer.Canvas.Font.Name:='宋体';
     printer.canvas.Font.Size:=15;
     printer.canvas.Font.Style:=[fsBold];
     s2:='标题';
     x:=x+StringGrid1.DefaultColWidth*PointScale*3;
     Printer.Canvas.TextOut(x+8,y+8,s2);
     printer.EndDoc;
     ShowMessage('开始打印...');
     StatusBar1.Panels.Items[0].Text:='正在打印....';
     //Timer1.Enabled:=true;
  end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值