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

  • 相关阅读:
    做题总结
    关于SQLSERVER中用SQL语句查询的一些个人理解
    关于SQLSERVER联合查询一点看法
    C#中怎样实现序列化和反序列化
    java内部类的使用
    C#抽象类
    匿名类
    Foreach能够循环的本质
    C#索引器
    深入了解接口的使用
  • 原文地址:https://www.cnblogs.com/qzfitsoft/p/2405351.html
Copyright © 2011-2022 走看看