DBGrid、DBGrideh专题总结,来自delphi园地

一、打印dbgrid数据:

//==============================================================================

//打印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;

//==============================================================================

//1.输出标题********************************************************************

//==============================================================================

procedure Print_Title;

begin

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 := 20;

DrawText(Printer.Canvas.Handle,PChar(Title),Length(Title),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);

Printer.Canvas.Rectangle(PageEdgeX, PageEdgeY, Printer.PageWidth - PageEdgeX, PageEdgeY + 1);

end;

//==============================================================================

//2.输出列头********************************************************************

//==============================================================================

procedure Print_Column;

var j: integer;

begin

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), RowHeight);

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: if Rect.Right-Rect.Left>=Printer.Canvas.TextWidth(TempStr)

then DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE)

else DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);

end;

Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);

end;

Temp_Y := Temp_Y + RowHeight;

end;

//==============================================================================

//3.输出DBGrid内容**************************************************************

//==============================================================================

procedure Print_Cells;

var j: integer;

begin

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), 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)

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 Exit;

end;

end;

//==============================================================================

//4.输出页脚********************************************************************

//==============================================================================

procedure Print_Footer;

begin

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, 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);

end;

//==============================================================================

begin

PrintDialog := TPrintDialog.Create(DBGrid);

if PrintDialog.Execute then

begin

//==========================================================================

//0.取当前打印机X,Y方向每英寸像素*******************************************

//==========================================================================

PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);

PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);

//==========================================================================

//1.变量初始化**************************************************************

//==========================================================================

PageEdgeX := PixelsPerInchX div 6;

PageEdgeY := PixelsPerInchY div 5 * 4;

RowHeight := Trunc(1.5 * 9 * PixelsPerInchY / 72);

Scale := PixelsPerInchX / Screen.PixelsPerInch;

//==========================================================================

try

Printer.BeginDoc;

DBGrid.DataSource.DataSet.First;

while not DBGrid.DataSource.DataSet.Eof do

begin

Print_Title;

Print_Column;

Print_Cells;

Print_Footer;

Printer.NewPage;

end;

//========================================================================

if not Printer.Aborted then Printer.EndDoc;

except

on E:EPrinter do

begin

MessageBox(Application.Handle,PChar('打印机没有准备好!'),'提示!',MB_OK+MB_ICONINFORMATION);

Printer.Abort;

Exit;

end;

on E:Exception do

begin

raise;

Exit;

end;

end;

end;

//============================================================================

PrintDialog.Free;

end;

二、dbgrideh标题排序:

首先把需要排序的title.titlebutton:=true

ehlib的optioneh中autosortmarking最好设为true

titelbutton事件中写:

var

sortstring:string;

begin

//进行排序

with Column do

begin

if FieldName = '' then Exit;

case Title.SortMarker of

smNoneEh:

begin

Title.SortMarker := smDownEh;

sortstring := Column.FieldName + ' ASC';

end;

smDownEh:sortstring:= Column.FieldName + ' ASC';

smUpEh:sortstring:=Column.FieldName + ' DESC';

end;

//数据集排序。

try

dataset.Sort:=sortstring //dataset为实际数据集变量名

except

end;