您的位置:首页 > 其它

用PRINTER打印DBGRID

2011-10-12 21:56 260 查看
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.

//---------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: