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.
//---------------------------------------------------------------------------