• dbgrid、dbgrideh专题总结


    一、打印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;    


  • 相关阅读:
    SpringBoot系统列 4
    SpringBoot系统列 3
    SpringBoot系统列 2
    SpringBoot系统列 1
    Nginx+Keepalived+Tomcat高可用负载均衡,Zookeeper集群配置,Mysql(MariaDB)搭建,Redis安装,FTP配置
    Java分布式集群,使用synchronized和Redis保证Job的原子性
    Linux 公网IP和内网IP,Dubbo提供者注册到了内网IP上怎么处理!
    SpringMvc自动任务调度之task实现项目源码,@Scheduled
    SFTP工具类
    Java代码实现文件添加数字签名、验证数字签名
  • 原文地址:https://www.cnblogs.com/jiangyuxuan/p/1285032.html
Copyright © 2020-2023  润新知