• 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;
  • 相关阅读:
    Spark&Hadoop:scala编写spark任务jar包,运行无法识别main函数,怎么办?
    Linux:krb5
    SqlServer数据库端口默认是1433吗?
    Linux下使用shell实现上传linux下某个目录下所有文件到ftp
    Spark+Hadoop+Hive集群上数据操作记录
    hadoop之 Hadoop2.2.0中HDFS的高可用性实现原理
    虚拟路由冗余协议VRRP
    hadoop 之Hadoop生态系统
    Oracle NoLogging Append 方式减少批量insert的redo_size
    Oracle常用的性能诊断语句
  • 原文地址:https://www.cnblogs.com/ghd2004/p/1265535.html
Copyright © 2020-2023  润新知