在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、打印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; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论