用PRINTER打印DBGRID

BCB

 

//打印DBGrid
//==============================================================================
void __fastcall TForm_gpxx::DBGridPrint1(TDBGrid *DBGrid, String Title)
{
//  PrintDialog: TPrintDialog;
  int RowHeight, Temp_X, Temp_Y, PageEdgeX, PageEdgeY, PixelsPerInchX, PixelsPerInchY;
  String TempStr;
  double Scale;
  TRect Rect;
  int j;

  TPrinter *print = Printer();

  //0.取当前打印机X,Y方向每英寸像素*******************************************
  PixelsPerInchX = GetDeviceCaps(print->Handle, LOGPIXELSX);
  PixelsPerInchY = GetDeviceCaps(print->Handle, LOGPIXELSY);

  //1.变量初始化**************************************************************
  PageEdgeX = PixelsPerInchX / 6 - 10;
  PageEdgeY = PixelsPerInchY / 5 * 4 ;
  RowHeight = 1.5 * 9 * PixelsPerInchY / 72;
  Scale = PixelsPerInchX / Screen->PixelsPerInch;

    //1.输出标题********************************************************************
  Rect = Bounds(0,0,print->PageWidth,PageEdgeY);
  print->Canvas->Font->Name = "楷体_GB2312";
  print->Canvas->Font->Style << fsBold;
  print->Canvas->Font->Size = 12;
  DrawText(print->Canvas->Handle,Title.c_str(),Title.Length(),&Rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

  DBGrid->DataSource->DataSet->First();
  while(!DBGrid->DataSource->DataSet->Eof)
  {
    //2.输出列头********************************************************************
    print->Canvas->Font->Name = "黑体";
    print->Canvas->Font->Size = 9;
    Temp_X = PageEdgeX;
    Temp_Y = PageEdgeY;
    //========================================================================

    for(j=0;j < DBGrid->Columns->Count;j++)
    {
        if(!DBGrid->Columns->operator [](j)->Visible) continue;
        //======================================================================
        TempStr = DBGrid->Columns->operator [](j)->Title->Caption;
        Rect = Bounds(Temp_X, Temp_Y, DBGrid->Columns->operator [](j)->Width*Scale + 10, RowHeight);
        print->Canvas->Rectangle(Rect);
        Rect = Bounds(Temp_X+5, Temp_Y, DBGrid->Columns->operator [](j)->Width*Scale - 5, RowHeight);
        DrawText(print->Canvas->Handle,TempStr.c_str(),TempStr.Length(),&Rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        Temp_X = Temp_X + DBGrid->Columns->operator [](j)->Width*Scale;
    }
    Temp_Y = Temp_Y + RowHeight;

    //3.输出DBGrid内容**************************************************************
    print->Canvas->Font->Name = "宋体";
    print->Canvas->Font->Style >> fsBold;

    while(Temp_Y < print->PageHeight-PageEdgeY)
    {
       Temp_X = PageEdgeX;
       for(j=0;j < DBGrid->Columns->Count;j++)
       {
         if(!DBGrid->Columns->operator [](j)->Visible) continue;
         Rect = Bounds(Temp_X, Temp_Y, DBGrid->Columns->operator [](j)->Width*Scale + 10, RowHeight);
         print->Canvas->Rectangle(Rect);
         Rect = Bounds(Temp_X+5, Temp_Y, (DBGrid->Columns->operator [](j)->Width*Scale)-5, RowHeight);

         if(DBGrid->Columns->operator [](j)->Field->DataType == ftCurrency ||     //TCurrencyField or
            DBGrid->Columns->operator [](j)->Field->DataType == ftLargeint || //TLargeIntField) or
            DBGrid->Columns->operator [](j)->Field->DataType == ftSmallint || //TSmallIntField) or
            DBGrid->Columns->operator [](j)->Field->DataType == ftInteger ||  //TIntegerField)  or
            DBGrid->Columns->operator [](j)->Field->DataType == ftFloat ||    //TFloatField)   or
            DBGrid->Columns->operator [](j)->Field->DataType == ftWord)      //TWordField)
  //       TempStr = FormatFloat(',##0.00',DBGrid->Columns->operator [](j-1)->Field.AsFloat)
           TempStr = FormatFloat("#",DBGrid->Columns->operator [](j)->Field->AsFloat);  // 数值型
         else
           TempStr = DBGrid->Columns->operator [](j)->Field->AsString;                  // 字符型

         switch (DBGrid->Columns->operator [](j)->Field->Alignment)
         {
           case taLeftJustify: //居左
                DrawText(print->Canvas->Handle,TempStr.c_str(),TempStr.Length(),&Rect,DT_LEFT | DT_VCENTER | DT_SINGLELINE);
                break;
           case taCenter:     //居中
                DrawText(print->Canvas->Handle,TempStr.c_str(),TempStr.Length(),&Rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
                break;
           case taRightJustify: //居右
                DrawText(print->Canvas->Handle,TempStr.c_str(),TempStr.Length(),&Rect,DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
                break;
         }
         Temp_X = Temp_X + DBGrid->Columns->operator [](j)->Width*Scale;
       }
       Temp_Y = Temp_Y + RowHeight;
       DBGrid->DataSource->DataSet->Next();
       if(DBGrid->DataSource->DataSet->Eof) break;
    }
  }
  //4.输出页脚********************************************************************
  Temp_Y = print->PageHeight - PageEdgeY + RowHeight;
  //4.0.输出横线************************************************************
  print->Canvas->Rectangle(PageEdgeX, Temp_Y, print->PageWidth - PageEdgeX, Temp_Y + 1);
  //4.1.输出日期************************************************************
  Rect = Bounds(PageEdgeX + 200, Temp_Y, print->PageWidth-PageEdgeX, RowHeight);
  DrawText(print->Canvas->Handle,DateTimeToStr(Now()).c_str(),DateTimeToStr(Now()).Length(),&Rect,DT_LEFT | DT_VCENTER | DT_SINGLELINE);
  //4.2.输出页号************************************************************
  Rect = Bounds(PageEdgeX - 200, Temp_Y, print->PageWidth-PageEdgeX*2, RowHeight);
  DrawText(print->Canvas->Handle,("#" + IntToStr(print->PageNumber)).c_str(),("#" + IntToStr(print->PageNumber)).Length(),&Rect,DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
  if(!DBGrid->DataSource->DataSet->Eof) print->NewPage();
}
//---------------------------------------------------------------------------

 

 

DELPHI

 

//---------------------------------------------------------------------------
unit DBGrid_print;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms,DB, ADODB, Grids, DBGrids, Printers;

  procedure DBGridPrint(DBGrid: TDBGrid; Title: string);

implementation

//==============================================================================
//打印DBGrid
//==============================================================================
procedure DBGridPrint(DBGrid: TDBGrid; Title: string);
  var
//  PrintDialog: TPrintDialog;
  RowHeight, Temp_X, Temp_Y, PageEdgeX, PageEdgeY, PixelsPerInchX, PixelsPerInchY: integer;
  TempStr: string;
  Scale: Double;
  Rect: TRect;
  var j: integer;

  begin
    //==========================================================================
    //0.取当前打印机X,Y方向每英寸像素*******************************************
    //==========================================================================
    PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
    //==========================================================================
    //1.变量初始化**************************************************************
    //==========================================================================
    PageEdgeX := PixelsPerInchX div 6 - 10;
    PageEdgeY := PixelsPerInchY div 5 * 4 ;
    RowHeight := Trunc(1.5 * 9 * PixelsPerInchY / 72);
    Scale :=   PixelsPerInchX / Screen.PixelsPerInch;
    //==============================================================================
    //1.输出标题********************************************************************
    //==============================================================================
    Rect := Bounds(0,0,Printer.PageWidth,PageEdgeY);
    Printer.Canvas.Font.Name := '楷体_GB2312';
    Printer.Canvas.Font.Style := Printer.Canvas.Font.Style + [fsBold];
    Printer.Canvas.Font.Size := 12;
    DrawText(Printer.Canvas.Handle,PChar(Title),Length(Title),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);

    DBGrid.DataSource.DataSet.First;
    while not DBGrid.DataSource.DataSet.Eof do
    begin
      //==============================================================================
      //2.输出列头********************************************************************
      //==============================================================================
      Printer.Canvas.Font.Name := '黑体';
      Printer.Canvas.Font.Size := 9;
      Temp_X := PageEdgeX;
      Temp_Y := PageEdgeY;
      //========================================================================

      for j:=1 to DBGrid.Columns.Count do
      begin
        if not DBGrid.Columns[j-1].Visible then Continue;
        //======================================================================
        TempStr := DBGrid.Columns[j-1].Title.Caption;
        Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale)+10, RowHeight);
        Printer.Canvas.Rectangle(Rect);
        Rect := Bounds(Temp_X+5, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale)-5, RowHeight);
        DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
        Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
      end;

      Temp_Y := Temp_Y + RowHeight;
      //==============================================================================
      //3.输出DBGrid内容**************************************************************
      //==============================================================================
      Printer.Canvas.Font.Name := '宋体';
      Printer.Canvas.Font.Style := Printer.Canvas.Font.Style - [fsBold];

      while Temp_Y<Printer.PageHeight-PageEdgeY do
      begin
       Temp_X := PageEdgeX;
       for j:=1 to DBGrid.Columns.Count do
       begin
         if not DBGrid.Columns[j-1].Visible then Continue;
         Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale)+10, RowHeight);
         Printer.Canvas.Rectangle(Rect);
         Rect := Bounds(Temp_X+5, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale)-5, RowHeight);
         if (DBGrid.Columns[j-1].Field is TCurrencyField)
         or (DBGrid.Columns[j-1].Field is TLargeIntField)
         or (DBGrid.Columns[j-1].Field is TSmallIntField)
         or (DBGrid.Columns[j-1].Field is TIntegerField)
         or (DBGrid.Columns[j-1].Field is TFloatField)
         or (DBGrid.Columns[j-1].Field is TWordField)
  //       then TempStr := FormatFloat(',##0.00',DBGrid.Columns[j-1].Field.AsFloat)
         then TempStr := FormatFloat(',#',DBGrid.Columns[j-1].Field.AsFloat)
         else TempStr := DBGrid.Columns[j-1].Field.AsString;
         //====================================================================
         case DBGrid.Columns[j-1].Field.Alignment of
           //case.1.居中*******************************************************
           taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
           //case.2.居左*******************************************************
           taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
           //case.3.居右*******************************************************
           taRightJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
         end;
         Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
       end;
       Temp_Y := Temp_Y + RowHeight;
       DBGrid.DataSource.DataSet.Next;
       if DBGrid.DataSource.DataSet.Eof then break;
     end;
    end;
    //4.输出页脚********************************************************************
    Temp_Y := Printer.PageHeight - PageEdgeY + RowHeight;
    //4.0.输出横线************************************************************
    Printer.Canvas.Rectangle(PageEdgeX, Temp_Y, Printer.PageWidth - PageEdgeX, Temp_Y + 1);
    //4.1.输出日期************************************************************
    Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX, RowHeight);
    DrawText(Printer.Canvas.Handle,PChar(DateTimeToStr(Now)),Length(DateTimeToStr(Now)),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
    //4.2.输出页号************************************************************
    Rect := Bounds(PageEdgeX-1000, Temp_Y, Printer.PageWidth-PageEdgeX*2, RowHeight);
    DrawText(Printer.Canvas.Handle,PChar('#'+IntToStr(Printer.PageNumber)),Length('#'+IntToStr(Printer.PageNumber)),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
    if not DBGrid.DataSource.DataSet.Eof then Printer.NewPage;
  end;
end.

//---------------------------------------------------------------------------
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值