这是我编的一个打印DBGIRD的实例,供参考。
procedure Tf_ypmh.Button12Click(Sender: TObject);
  const
    leftblank=1;
    rightblank=1;
    topblank=1;
    bottomblank=1;
    const_page=11;
  var
    pointx,pointy:integer;
   pointscale,printstep:integer;
    s:string;
    x,y:integer;
    page,i:integer;
    m_sum_grje,m_sum_grje_all:real;//发货合计
    m_sum_lsje,m_sum_lsje_all:real;//零售合计
    m_sum_ce,m_sum_ce_all:real;//差额合计
    m_s_sum:string;//字符临时量
    m_page:integer;//页码
    m_str:string;
    m_newpage:boolean;
    m_mess:integer;
    printok:string;
begin
    printok:='y';
 while printok='y' do
   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.orientation:=poportrait;
    printer.canvas.font.name:='宋体';
    printer.canvas.font.size:=10;
    s:='胡';
    printstep:=printer.canvas.textheight(s)+16;//行距
    x:=pointx*leftblank-70;
    y:=pointy*topblank+20;    //
    m_sum_grje:=0;
    m_sum_lsje:=0;
    m_sum_ce:=0;
    m_sum_grje_all:=0;
    m_sum_lsje_all:=0;
    m_sum_ce_all:=0;
    m_page:=1;
    m_newpage:=true; //创建新页标记
with  f_dbfrom.t_qd_rkd do   begin
    edit10.enabled:=true;
    edit7.enabled:=false;
    edit11.enabled:=false;
    //spinedit3.enabled:=false;
    spinedit2.enabled:=false;
    edit8.enabled:=false;
    edit9.enabled:=false;
     //f_rep_qd_fhd.quickrep1.preview;
      //打印报表
   if Active and (recordcount>0) then
      begin
         page:=0;
         printer.begindoc;
         first;
         while not eof do
           begin
               if (page=const_page) then       //换页
                         begin
                          m_sum_grje:=0;
                          m_sum_lsje:=0;
                          m_sum_ce:=0;
                          m_page:=m_page+1;
                          page:=0;
                          x:=pointx*leftblank-70;
                         if  m_newpage=false then
                          y:=y+printstep*6+16;
                         end;
               if page=0 then
                          begin
                            m_newpage:=false;
                            printer.Canvas.Font.Size:=16;
                            printer.Canvas.textout(x+600,y-80,'药品入库清单及验收单');
                            printer.Canvas.Font.Size:=10;
                            printer.Canvas.TextOut(x+10,y-30,'验收单位:正场卫生院');
                            printer.Canvas.TextOut(x+400,y-30,'供货单位:'+edit10.text);
                            printer.Canvas.TextOut(x+700,y-30,'到货日期:'+datetostr(date()));
                            printer.Canvas.TextOut( x+1000,y-30,'入库单编号:'+fieldbyname('rkdbh').asstring);
                            printer.Canvas.TextOut(x+1300,y-30,'第  '+ inttostr(m_page)+'  页');
                          end ;

解决方案 »

  1.   


                   if page=0 then //表头
                             for i:=0 to 13 do
                               begin
                                printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
                                printer.canvas.textout(x+8,y+8,dbgrid1.Columns[i].title.caption);
                                x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
                               end
                   else
                      for i:=0 to 13 do
                         begin
                              printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
                              if (i=4) or (i=5) or (i=6) or (i=7) or (i=8) then
                                 begin
                                   str(dbgrid1.Fields[i].asfloat:0:2,m_str);
                                   printer.canvas.textout(x+8,y+8,m_str);
                                 end;
                             if (i=0)or (i=1)or (i=2) or (i=3)or(i=9)or (i=10) or (i=11)or(i=13)  then
                                 printer.canvas.textout(x+8,y+8,dbgrid1.Fields[i].asstring);
                                 x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
                          end;
                           if page<>0 then
                             begin
                                    //统计
                                    m_sum_grje:=m_sum_grje+fieldbyname('sumgrj').asfloat;
                                    m_sum_lsje:=m_sum_lsje+fieldbyname('sumdj').asfloat;
                                    m_sum_ce:=m_sum_ce+fieldbyname('sumyjce').asfloat;
                                    m_sum_grje_all:=m_sum_grje_all+fieldbyname('sumgrj').asfloat;
                                    m_sum_lsje_all:=m_sum_lsje_all+fieldbyname('sumdj').asfloat;
                                    m_sum_ce_all:=m_sum_ce_all+fieldbyname('sumyjce').asfloat;
                                    next;
                             end;
                          y:=y+printstep;
                          if (page=const_page-1)or eof then     //打印合计
                                    begin
                                       printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
                                       str(m_sum_grje:0:2,m_s_sum);
                                       printer.Canvas.TextOut(100+8,y+8,'购货金额小计:'+m_s_sum);
                                       str(m_sum_lsje:0:2,m_s_sum);
                                       printer.Canvas.TextOut(504+8,y+8,'零售金额小计:'+m_s_sum);
                                       str(m_sum_ce:0:2,m_s_sum);
                                       printer.Canvas.TextOut(1000+8,y+8,'差额小计:'+m_s_sum);
                                       y:=y+printstep;
                                       printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字):         验收人(签字):              药品类型:'+m_yplx );
                                       y:=y-printstep;
                                      //打印表尾
                                    end;
                         { if eof then
                              begin
                                       y:=y+printstep;
                                       printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
                                       str(m_sum_grje_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(100+8,y+8,'发货金额总计:'+m_s_sum);
                                       str(m_sum_lsje_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(504+8,y+8,'零售金额总计:'+m_s_sum);
                                       str(m_sum_ce_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(1000+8,y+8,'差额总计:'+m_s_sum);
                                       y:=y+printstep;
                                       printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字):         验收人(签字):              药品类型:'+m_yplx );
                                       y:=y-printstep;
                                      //打印表尾
                             end;  }                          page:=page+1;
                             x:=pointx*leftblank-70;
                         if m_page<6   then
                          if (y+printstep)>(printer.pageheight-120) then                            //
                                           begin
                                                  m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+80;   //80
                                            end;
                          if (m_page>=6)and (m_page<9) then
                                   if   (y+printstep-60)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+140;   //80
                                         end;
                       if (m_page>=9)and (m_page<12) then
                                   if   (y+printstep-120)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+200;   //80
                                         end;
                       if (m_page>=12)and (m_page<15) then
                                   if   (y+printstep-180)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+260;   //80
                                         end;
                       if m_page>=15 then
                                   if   (y+printstep-240)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+320;   //80
                                         end;                                                                                                                         //
                  end;
                          printer.enddoc;
                          first;
                          //application.messagebox('打印完成','打印',32);
          end;
          //打印报表
       //f_rep_qd_rkd.quickrep1.Preview;;
         m_mess:=application.messagebox('你要重新打印吗?','友情提示',mb_yesno+mb_defbutton2+mb_systemmodal+
         mb_iconexclamation);
        if m_mess=6 then
            PRINTOK:='y'
         ELSE
            PRINTOK:='N';    end;
    end;
      with f_dbfrom.q_sql do
        begin
          close;
          sql.Clear;
          sql.Add('insert into yp_rkd(rkdbh,ypbh,ypdj,ypgg,ypcd,ypdw,ypsl,yppfj,ypgrj,ypph,ypyxrq,fphm,rktime)');
          sql.Add('select a.rkdbh,a.ypbh,b.ypdj,b.ypgg,b.ypcd,b.ypdw,a.ypsl,b.yppfj,b.ypgrj,a.ypph,a.ypyxrq,a.fphm,a.rkrq');
          sql.Add('from qd_rkd a,yp b where a.ypbh=b.ypbh');
          execsql;
        end;
      with f_dbfrom.t_qd_rkd do
        begin
         first;
         while not isempty() do
          begin
           edit;
           delete;
           next;
          end;
       end;
      button10.Enabled:=false;
      button11.Enabled:=false;
      button12.enabled:=false;
    end;
      

  2.   


                   if page=0 then //表头
                             for i:=0 to 13 do
                               begin
                                printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
                                printer.canvas.textout(x+8,y+8,dbgrid1.Columns[i].title.caption);
                                x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
                               end
                   else
                      for i:=0 to 13 do
                         begin
                              printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
                              if (i=4) or (i=5) or (i=6) or (i=7) or (i=8) then
                                 begin
                                   str(dbgrid1.Fields[i].asfloat:0:2,m_str);
                                   printer.canvas.textout(x+8,y+8,m_str);
                                 end;
                             if (i=0)or (i=1)or (i=2) or (i=3)or(i=9)or (i=10) or (i=11)or(i=13)  then
                                 printer.canvas.textout(x+8,y+8,dbgrid1.Fields[i].asstring);
                                 x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
                          end;
                           if page<>0 then
                             begin
                                    //统计
                                    m_sum_grje:=m_sum_grje+fieldbyname('sumgrj').asfloat;
                                    m_sum_lsje:=m_sum_lsje+fieldbyname('sumdj').asfloat;
                                    m_sum_ce:=m_sum_ce+fieldbyname('sumyjce').asfloat;
                                    m_sum_grje_all:=m_sum_grje_all+fieldbyname('sumgrj').asfloat;
                                    m_sum_lsje_all:=m_sum_lsje_all+fieldbyname('sumdj').asfloat;
                                    m_sum_ce_all:=m_sum_ce_all+fieldbyname('sumyjce').asfloat;
                                    next;
                             end;
                          y:=y+printstep;
                          if (page=const_page-1)or eof then     //打印合计
                                    begin
                                       printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
                                       str(m_sum_grje:0:2,m_s_sum);
                                       printer.Canvas.TextOut(100+8,y+8,'购货金额小计:'+m_s_sum);
                                       str(m_sum_lsje:0:2,m_s_sum);
                                       printer.Canvas.TextOut(504+8,y+8,'零售金额小计:'+m_s_sum);
                                       str(m_sum_ce:0:2,m_s_sum);
                                       printer.Canvas.TextOut(1000+8,y+8,'差额小计:'+m_s_sum);
                                       y:=y+printstep;
                                       printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字):         验收人(签字):              药品类型:'+m_yplx );
                                       y:=y-printstep;
                                      //打印表尾
                                    end;
                         { if eof then
                              begin
                                       y:=y+printstep;
                                       printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
                                       str(m_sum_grje_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(100+8,y+8,'发货金额总计:'+m_s_sum);
                                       str(m_sum_lsje_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(504+8,y+8,'零售金额总计:'+m_s_sum);
                                       str(m_sum_ce_all:0:3,m_s_sum);
                                       printer.Canvas.TextOut(1000+8,y+8,'差额总计:'+m_s_sum);
                                       y:=y+printstep;
                                       printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字):         验收人(签字):              药品类型:'+m_yplx );
                                       y:=y-printstep;
                                      //打印表尾
                             end;  }                          page:=page+1;
                             x:=pointx*leftblank-70;
                         if m_page<6   then
                          if (y+printstep)>(printer.pageheight-120) then                            //
                                           begin
                                                  m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+80;   //80
                                            end;
                          if (m_page>=6)and (m_page<9) then
                                   if   (y+printstep-60)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+140;   //80
                                         end;
                       if (m_page>=9)and (m_page<12) then
                                   if   (y+printstep-120)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+200;   //80
                                         end;
                       if (m_page>=12)and (m_page<15) then
                                   if   (y+printstep-180)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+260;   //80
                                         end;
                       if m_page>=15 then
                                   if   (y+printstep-240)>(printer.pageheight-120) then
                                         begin
                                                     m_newpage:=true;
                                                     printer.newpage;
                                                    y:=pointy*topblank+320;   //80
                                         end;                                                                                                                         //
                  end;
                          printer.enddoc;
                          first;
                          //application.messagebox('打印完成','打印',32);
          end;
          //打印报表
       //f_rep_qd_rkd.quickrep1.Preview;;
         m_mess:=application.messagebox('你要重新打印吗?','友情提示',mb_yesno+mb_defbutton2+mb_systemmodal+
         mb_iconexclamation);
        if m_mess=6 then
            PRINTOK:='y'
         ELSE
            PRINTOK:='N';    end;
    end;
      with f_dbfrom.q_sql do
        begin
          close;
          sql.Clear;
          sql.Add('insert into yp_rkd(rkdbh,ypbh,ypdj,ypgg,ypcd,ypdw,ypsl,yppfj,ypgrj,ypph,ypyxrq,fphm,rktime)');
          sql.Add('select a.rkdbh,a.ypbh,b.ypdj,b.ypgg,b.ypcd,b.ypdw,a.ypsl,b.yppfj,b.ypgrj,a.ypph,a.ypyxrq,a.fphm,a.rkrq');
          sql.Add('from qd_rkd a,yp b where a.ypbh=b.ypbh');
          execsql;
        end;
      with f_dbfrom.t_qd_rkd do
        begin
         first;
         while not isempty() do
          begin
           edit;
           delete;
           next;
          end;
       end;
      button10.Enabled:=false;
      button11.Enabled:=false;
      button12.enabled:=false;
    end;