zoukankan      html  css  js  c++  java
  • 一个很实用的Ehlib排序函数,适合ADO

    Ehlib3.0版本以上虽然支持排序功能,但不支持带有Order By的SQL语句,而且排序很慢;我写的这个排序函数,利用ADO的sort方法,排序很快,几万条数据也是很快。该函数支持Lookup字段排序,不支持计算字段排序,因为计算字段值在内存里高速运算。排序分为:升序、降序和默认三种,支持排序图标。

    procedure  SortDBGridEh(Sender: TObject; ACol: Integer;
      Column: TColumnEh);
    var
      FieldName, SortStr: string;
    begin
      Screen.Cursor := crSQLWait;
      try
        if (Sender is TDBGridEh) and
          ((Sender as TDBGridEh).DataSource.DataSet <> nil) then
        begin
          if not ((Sender as TDBGridEh).DataSource.DataSet is TCustomADODataSet) then
            Exit;

          if not (Sender as TDBGridEh).DataSource.DataSet.Active then
            Exit;

          FieldName := Column.FieldName;
          if (Sender as TDBGridEh).DataSource.DataSet.FindField(FieldName).IsBlob then
            Exit;

          if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkData then
            SortStr := FieldName
          else if (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).FieldKind =
            fkLookup then
            FieldName := (Sender as TDBGridEh).DataSource.DataSet.FieldByName(FieldName).KeyFields
          else
            FieldName := '';

          if (FieldName = '') or (Pos(';', FieldName) > 0) then
            Exit;
          case Column.Title.SortMarker of
            smNoneEh:
              begin
                Column.Title.SortMarker := smUpEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort :=
                  FieldName;

              end;
            smUpEh:
              begin
                Column.Title.SortMarker := smDownEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort :=
                  FieldName + ' DESC';
              end;
            smDownEh:
              begin
                Column.Title.SortMarker := smNoneEh;
                TCustomADODataSet((Sender as TDBGridEh).DataSource.DataSet).Sort := '';
              end;
          end;
        end;
      finally
        Screen.Cursor := crDefault;
      end;
    end;

    --程序实现如下:
    --在DBGridEh的事件OnTitleBtnClick引用该函数即可:
    procedure TFrmU_BasicSetup.dbgAddrCodeTitleBtnClick(Sender: TObject;
      ACol: Integer; Column: TColumnEh);
    begin
       SortDBGridEh(Sender, ACol, Column);
    end;
    --为了保证表格的每一列都能点击触发排序,你需要将你需要排序的列属性
    --  Title->TitleButton设置为True。


    文章来自: 好喜爱学习网(http://www.haoxiai.net/) 网址:http://www.haoxiai.net/bianchengyuyan/Delphi/14025.html

  • 相关阅读:
    Python打包方法——Pyinstaller
    在线检测显示器屏幕尺寸
    python_分布式进程中遇到的问题
    软件测试面试题(一)
    Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
    mac系统 安装 IPython
    京东自动抢茅台脚本 Python
    CMake使用总结(一)
    小白安装eclipse插件—>testNG
    离线安装eclipse-testNG插件
  • 原文地址:https://www.cnblogs.com/qzfitsoft/p/2405351.html
Copyright © 2011-2022 走看看