linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·delphi轻松设置无边框透明窗体
·delphi第三方控件安装(Ehlib)
·DELPHI组件安装全攻略
·delphi动态创建控件
·开发工具比较Visual C++ VS De
·delphi完整身份证效验程序实例
·delphi中的Format函数详解
·delphi编程获取打印机的打印任
·如何判断文本文件的编码格式
·深入研究Variant数组
·用delphi编写网络游戏的外挂
·Delphi技巧-用户自定义数据类型
·delphi设置控件透明
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
在DELPHI中打印TDBGrid内容
[ 作者:  加入时间:2007-10-30 16:05:41  来自:Linux联盟收集整理 ]
打印TDBGrid中的内容,请看如下代码:CDSLinux联盟
CDSLinux联盟
CDSLinux联盟
procedure PrintDbGrid(DataSet:TDataSet;DbGrid:TDbGrid;Title:String);CDSLinux联盟
varCDSLinux联盟
PointX,PointY:integer;CDSLinux联盟
ScreenX:integer;CDSLinux联盟
i,lx,ly:integer;CDSLinux联盟
px1,py1,px2,py2:integer;CDSLinux联盟
RowPerPage,RowPrinted:integer;CDSLinux联盟
ScaleX:Real;CDSLinux联盟
THeight:integer;CDSLinux联盟
TitleWidth:integer;CDSLinux联盟
SumWidth:integer;CDSLinux联盟
PageCount:integer;CDSLinux联盟
SpaceX,SpaceY:integer;CDSLinux联盟
RowCount:integer;CDSLinux联盟
beginCDSLinux联盟
  PointX:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSX)
/2.54);CDSLinux联盟
PointY:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSY)
/2.54);CDSLinux联盟
ScreenX:=Round(Screen.PixelsPerInch
/2.54);CDSLinux联盟
ScaleX:=PointX
/ScreenX;CDSLinux联盟
RowPrinted:=0;CDSLinux联盟
  SumWidth:=0;CDSLinux联盟
  printer.BeginDoc;CDSLinux联盟
  With Printer.Canvas doCDSLinux联盟
    beginCDSLinux联盟
      DataSet.DisableControls;CDSLinux联盟
      DataSet.First ;CDSLinux联盟
      THeight:=Round(TextHeight('我')*1.5);
//设定每行高度为字符高的1.5倍CDSLinux联盟
   SpaceY:= Round(TextHeight('我')
/4);CDSLinux联盟
   SpaceX:=Round(TextWidth('我')
/4);CDSLinux联盟
   RowPerpage:=Round((printer.PageHeight-5*PointY)
/THeight); //上下边缘各2厘米CDSLinux联盟
   ly:=2*PointY;CDSLinux联盟
      PageCount:=0;CDSLinux联盟
      while not DataSet.Eof doCDSLinux联盟
      beginCDSLinux联盟
        if (RowPrinted=RowPerPage) or (RowPrinted=0) thenCDSLinux联盟
        beginCDSLinux联盟
          if RowPrinted<>0 thenCDSLinux联盟
          Printer.NewPage;CDSLinux联盟
          RowPrinted:=0;CDSLinux联盟
          PageCount:=PageCount+1;CDSLinux联盟
          Font.Name:='宋体';CDSLinux联盟
          Font.size:=16;CDSLinux联盟
          Font.Style:=Font.Style+[fsBold];CDSLinux联盟
          lx:=Round((Printer.PageWidth-TextWidth(Title))
/2);CDSLinux联盟
       ly:=2*PointY;CDSLinux联盟
          TextOut(lx,ly,Title);CDSLinux联盟
          Font.Size:=11;CDSLinux联盟
          Font.Style:=Font.Style-[fsBold];CDSLinux联盟
          lx:=Printer.PageWidth-5*PointX;CDSLinux联盟
          ly:=Round(2*PointY+0.2*PointY);CDSLinux联盟
          if RowPerPage*PageCount>DataSet.RecordCount thenCDSLinux联盟
          RowCount:=DataSet.RecordCountCDSLinux联盟
          elseCDSLinux联盟
          RowCount:=RowPerPage*PageCount;CDSLinux联盟
          TextOut(lx,ly,'第'+IntToStr(RowPerPage*(PageCount-1)+1)+'-'+IntToStr(RowCount)+'条,共'+IntToStr(DataSet.RecordCount)+'条');CDSLinux联盟
          lx:=2*PointX;CDSLinux联盟
          ly:=ly+THeight*2;CDSLinux联盟
          py1:=ly-SpaceY;CDSLinux联盟
          if RowCount=DataSet.RecordCount thenCDSLinux联盟
          py2:=py1+THeight*(RowCount-RowPerPage*(PageCount-1)+1)CDSLinux联盟
          elseCDSLinux联盟
          py2:=py1+THeight*(RowPerPage+1);CDSLinux联盟
          SumWidth:=lx;CDSLinux联盟
          for i:=0 to DBGrid.Columns.Count-1 doCDSLinux联盟
          beginCDSLinux联盟
            px1:=SumWidth-SpaceX;CDSLinux联盟
            px2:=SumWidth;CDSLinux联盟
            MoveTo(px1,py1);CDSLinux联盟
            LineTo(px2,py2);CDSLinux联盟
            TitleWidth:=TextWidth(DBGrid.Columns[i].Title.Caption);CDSLinux联盟
            lx:=Round(SumWidth+(DBGrid.Columns[i].width*scaleX-titleWidth)
/2);CDSLinux联盟
         TextOut(lx,ly,DBGrid.Columns[i].Title.Caption);CDSLinux联盟
            SumWidth:=Round(SumWidth+DBGrid.Columns[i].width*scaleX)+SpaceX*2;CDSLinux联盟
          end;CDSLinux联盟
          px1:=SumWidth;      
//画最后一条竖线CDSLinux联盟
       px2:=SumWidth;CDSLinux联盟
          MoveTo(px1,py1);CDSLinux联盟
          LineTo(px2,py2);CDSLinux联盟
          px1:=2*PointX;            
//画第一条横线CDSLinux联盟
     px2:=SumWidth;CDSLinux联盟
          py1:=ly-SpaceY;CDSLinux联盟
          py2:=ly-SpaceY;CDSLinux联盟
          MoveTo(px1,py1);CDSLinux联盟
          LineTo(px2,py2);CDSLinux联盟
          py1:=py1+THeight;CDSLinux联盟
          py2:=py2+THeight;CDSLinux联盟
          MoveTo(px1,py1);CDSLinux联盟
          LineTo(px2,py2);CDSLinux联盟
        end;CDSLinux联盟
        lx:=2*PointX;CDSLinux联盟
        ly:=ly+THeight;CDSLinux联盟
        px1:=lx;CDSLinux联盟
        px2:=SumWidth;CDSLinux联盟
        py1:=ly-SpaceY+THeight;CDSLinux联盟
        py2:=ly-SpaceY+THeight;CDSLinux联盟
        MoveTo(px1,py1);CDSLinux联盟
        LineTo(px2,py2);CDSLinux联盟
        for i:=0 to DBGrid.Columns.Count-1 doCDSLinux联盟
        beginCDSLinux联盟
          TextOut(lx,ly,DataSet.FieldByname(DBGrid.Columns[i].Fieldname).AsString);CDSLinux联盟
          lx:=Round(lx+DBGrid.Columns[i].width*ScaleX+SpaceX*2);CDSLinux联盟
        end;CDSLinux联盟
        RowPrinted:=RowPrinted+1;CDSLinux联盟
        DataSet.next;CDSLinux联盟
      end;CDSLinux联盟
      DataSet.first;CDSLinux联盟
      DataSet.EnableControls;CDSLinux联盟
    end;CDSLinux联盟
    printer.EndDoc;CDSLinux联盟
  end;CDSLinux联盟
CDSLinux联盟
CDSLinux联盟
打印StringGrid内容CDSLinux联盟
CDSLinux联盟
CDSLinux联盟
Procedure TACDListerMain.PrintTable;CDSLinux联盟
VarCDSLinux联盟
margins: TRect;CDSLinux联盟
spacing: Integer;CDSLinux联盟
Cols: TList;CDSLinux联盟
Dlg: TPrintProgressDlg;CDSLinux联盟
CDSLinux联盟
Procedure SetColumnWidth;CDSLinux联盟
VarCDSLinux联盟
i, k, w: Integer;CDSLinux联盟
BeginCDSLinux联盟
  Printer.Canvas.Font.Style := [ fsBold ];CDSLinux联盟
  For i := 0 To Pred( Grid.ColCount ) DoCDSLinux联盟
  CDSLinux联盟
  Cols.Add( Pointer( Printer.Canvas.TextWidth( Grid.Cells[ i,0 ] )));CDSLinux联盟
  CDSLinux联盟
  Printer.Canvas.Font.Style := [];CDSLinux联盟
  For i := 1 To Pred( Grid.RowCount ) DoCDSLinux联盟
  For k := 0 To Pred( Grid.ColCount ) Do BeginCDSLinux联盟
    w:= Printer.Canvas.TextWidth( Grid.Cells[ k, i ] );CDSLinux联盟
    If w > Integer( Cols[ k ] ) ThenCDSLinux联盟
    Cols[ k ] := Pointer( w );CDSLinux联盟
    End; { For }CDSLinux联盟
    CDSLinux联盟
    w := 2 * Printer.Canvas.Font.PixelsPerInch div 3;CDSLinux联盟
    margins :=CDSLinux联盟
    Rect( w, w, Printer.PageWidth-w, Printer.PageHeight - w );CDSLinux联盟
    spacing := Printer.Canvas.Font.PixelsPerInch div 10;CDSLinux联盟
    CDSLinux联盟
    w := 0;CDSLinux联盟
    For i := 0 To Pred(cols.Count) DoCDSLinux联盟
    w := w + Integer( cols[ i ] ) + spacing;CDSLinux联盟
    w := w - spacing;CDSLinux联盟
    If w > (margins.right-margins.left ) Then BeginCDSLinux联盟
      w := w - (margins.right-margins.left );CDSLinux联盟
      cols[ cols.Count-2 ] :=CDSLinux联盟
      Pointer( Integer( cols[ cols.Count-2 ] ) - w );CDSLinux联盟
      End; { If }CDSLinux联盟
      CDSLinux联盟
      w:= 0;CDSLinux联盟
      For i := 0 To Pred(cols.Count) DoCDSLinux联盟
      w := w + Integer( cols[ i ] ) + spacing;CDSLinux联盟
      margins.right := w - spacing + margins.left;CDSLinux联盟
      End; { SetColumnWidth }CDSLinux联盟
      CDSLinux联盟
      Procedure DoPrint;CDSLinux联盟
      VarCDSLinux联盟
      i: Integer;CDSLinux联盟
      y: Integer;CDSLinux联盟
      Procedure DoLine(lineno: Integer);CDSLinux联盟
      VarCDSLinux联盟
      x, n: Integer;CDSLinux联盟
      r: TRect;CDSLinux联盟
      th: Integer;CDSLinux联盟
      BeginCDSLinux联盟
        If Length(Grid.Cells[0,lineno]) = 0 Then Exit;CDSLinux联盟
        CDSLinux联盟
        x:= margins.left;CDSLinux联盟
        With Printer.Canvas Do BeginCDSLinux联盟
            th := TextHeight( '膟' );CDSLinux联盟
            For n := 0 To Pred( Cols.Count ) Do BeginCDSLinux联盟
              r := Rect( 0, 0, Integer(Cols[ n ]), th);CDSLinux联盟
              OffsetRect( r, x, y );CDSLinux联盟
              TextRect( r, x, y, Grid.Cells[ n, lineno ] );CDSLinux联盟
              x := r.right + spacing;CDSLinux联盟
              End; { For }CDSLinux联盟
              End; { With }CDSLinux联盟
              y := y + th;CDSLinux联盟
              End; { DoLine }CDSLinux联盟
              Procedure DoHeader;CDSLinux联盟
              BeginCDSLinux联盟
                y:= margins.top;CDSLinux联盟
                With Printer.Canvas Do BeginCDSLinux联盟
                    Font.Style := [ fsBold ];CDSLinux联盟
                    DoLine( 0 );CDSLinux联盟
                    Pen.Width := Font.PixelsPerInch div 72;CDSLinux联盟
                    Pen.Color := clBlack;CDSLinux联盟
                    MoveTo( margins.left, y );CDSLinux联盟
                    LineTo( margins.right, y );CDSLinux联盟
                    Inc( y, 2 * Pen.Width );CDSLinux联盟
                    Font.Style := [ ];CDSLinux联盟
                    End; { With }CDSLinux联盟
                    End; { DoHeader }CDSLinux联盟
                    BeginCDSLinux联盟
                      y:= 0;CDSLinux联盟
                      For i := 1 To Pred( Grid.RowCount ) Do BeginCDSLinux联盟
                        Dlg.Progress( i );CDSLinux联盟
                        Application.ProcessMessages;CDSLinux联盟
                        If FPrintAborted Then Exit;CDSLinux联盟
                        CDSLinux联盟
                        If y = 0 ThenCDSLinux联盟
                        DoHeader;CDSLinux联盟
                        DoLine( i );CDSLinux联盟
                        If y >= margins.bottom Then BeginCDSLinux联盟
                          Printer.NewPage;CDSLinux联盟
                          y:= 0;CDSLinux联盟
                          End; { If }CDSLinux联盟
                          End; { For }CDSLinux联盟
                          End; { DoPrint }CDSLinux联盟
                          CDSLinux联盟
                          BeginCDSLinux联盟
                            FPrintAborted := False;CDSLinux联盟
                            Dlg := TPrintProgressDlg.Create( Application );CDSLinux联盟
                            With Dlg DoCDSLinux联盟
                              tryCDSLinux联盟
                                OnAbort := PrintAborted;CDSLinux联盟
                                Display( cPrintPreparation );CDSLinux联盟
                                SetProgressRange( 0, Grid.RowCount );CDSLinux联盟
                                Show;CDSLinux联盟
                                Application.ProcessMessages;CDSLinux联盟
                                Printer.Orientation := poLandscape;CDSLinux联盟
                                CDSLinux联盟
                                Printer.BeginDoc;CDSLinux联盟
                                Cols:= Nil;CDSLinux联盟
                                tryCDSLinux联盟
                                  Cols:= TLIst.Create;CDSLinux联盟
                                  Printer.Canvas.Font.Assign( Grid.Font );CDSLinux联盟
                                  SetColumnWidth;CDSLinux联盟
                                  Display( cPrintProceeding );CDSLinux联盟
                                  Application.ProcessMessages;CDSLinux联盟
                                  DoPrint;CDSLinux联盟
                                  finallyCDSLinux联盟
                                    Cols.Free;CDSLinux联盟
                                    If FPrintAborted ThenCDSLinux联盟
                                    Printer.AbortCDSLinux联盟
                                    ElseCDSLinux联盟
                                    Printer.EndDoc;CDSLinux联盟
                                  end;CDSLinux联盟
                                  finallyCDSLinux联盟
                                    Close;CDSLinux联盟
                                    End; { With }CDSLinux联盟
                                    End; { TACDListerMain.PrintTable }
CDSLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Delphi实现远程串口的数据采集  (2007-10-30 16:10:39)
 ·Delphi托盘编程实战演练  (2007-10-30 16:09:56)
 ·DELPHI中操作ACCESS技巧集  (2007-10-30 16:08:48)
 ·在Delphi 2005中安装组件  (2007-10-30 16:04:02)
 ·DELPHI组件安装全攻略  (2007-10-30 15:54:19)
 ·Delphi中树型控件的使用技巧  (2007-10-30 15:41:50)
 ·在DELPHI中用线程排序  (2007-10-30 15:41:06)
 ·Delphi的嵌入式asm: Byte快速转换为16进制  (2007-10-30 15:40:20)
 ·创建一个简单的Delphi专家  (2007-10-30 15:14:08)
 ·Delphi下的接口编程学习笔记  (2007-10-30 15:11:56)