递增排序的做法我已经知道了,那么两次点击列按钮分别按递增和递减的顺序,同时有一个改变方向的三角形小图标,请问如何能够实现?

解决方案 »

  1.   

    参考一下这个,看是否有帮助。ListView和dbgrid差不多 
    procedure DBGrid1TitleClick(Column: TColumn);
    var
        i,j,k,ii:integer;
        CurrentTitle,ls01:string;
        SQL_OrderString:string;
        TosetColor:Tcolor;
        ColumnIndex:integer;
        strSortFashion:Boolean;
    begin
        IF not Table1.Exists then
            exit;
        //查询语句
        ls01:='select * from NewDbProductSaleSort ';
        ToSetColor:=clBtnFace;
        Columnindex:=Column.Index;
        CurrentTiTle:=Trim(Column.TiTle.Caption);
        k:=DBGrid1.Columns.Count-1;
        for i:=0 to k do
        begin
           if DBGrid1.Columns[i]<>Column then //如非当前点击字段,则复原标题和颜色
           begin
                  DBGrid1.columns[i].Title.Color:=clBtnFace;
                  Column.Title.Color:=ToSetColor;
                  j:=Pos('↑',trim(DBGrid1.Columns[i].Title.Caption));
                  if j>0 then DBGrid1.Columns[i].Title.Caption:=Copy(trim(DBGrid1.Columns[i].Title.Caption),1,j-1);
                  j:=Pos('↓',trim(DBGrid1.Columns[i].Title.Caption));
                  if j>0 then DBGrid1.Columns[i].Title.Caption:=Copy(trim(DBGrid1.Columns[i].Title.Caption),1,j-1);
           end;
        end;
        j:=Pos('↓',CurrentTitle);  //判断是否顺排: J=0,没有顺排,j=1 当前已顺排
        k:=Pos('↑',CurrentTitle); //判断是否逆排: k=0,没有逆排,k=1 当前已逆排
        if j+k=0 then //如没有排序,则顺排
        begin
            if (UPPERCASE(Column.FieldName)='XH') or (UPPERCASE(Column.FieldName)='PRODUCTID') or (UPPERCASE(Column.FieldName)='PRODUCTNAME') then
               SQL_OrderString:=ls01+ ' Order By SaleNumber '
            else
               SQL_OrderString:=ls01+ ' Order By '+Column.FieldName;
            ToSetColor:=$00A6cadf;
            Column.Title.Caption:=CurrentTitle+'↓' ;
            strSortFashion:=false;
        end
        else
        begin
            if j>0 then //如已顺排,则逆排
            begin
                if (UPPERCASE(Column.FieldName)='XH') or (UPPERCASE(Column.FieldName)='PRODUCTID') or (UPPERCASE(Column.FieldName)='PRODUCTNAME') then
                    SQL_OrderString:=ls01+ ' Order By SaleNumber desc'
                else
                    SQL_OrderString:=ls01+ ' Order By '+Column.FieldName+' Desc';
                ToSetColor:=$00A6cadf;
                Column.Title.Caption:=Copy(CurrentTitle,1,j-1)+'↑';
                strSortFashion:=True;
            end
            else   //如已逆排,则恢复自然顺序
            begin
                strSortFashion:=true;
                SQL_OrderString:=ls01+' Order By SaleNumber desc';
                ToSetColor:=clBtnFace;
                Column.Title.Caption:=Copy(CurrentTitle,1,k-1);
            end;
        end;
        CurrentQuery.Close; //关闭当前query
        CurrentQuery.SQL.Clear;  //清除SQL语名
        CurrentQuery.SQL.Add(SQL_OrderString);
    //    DataSource1.DataSet:=CurrentQuery;
        CurrentQuery.Open;
        Table1.Close;
        Table1.BatchMove(CurrentQuery,batcopy);
        Table1.Open;
        Table1.DisableControls;
        if strSortFashion then
        begin
            Table1.First;
            ii:=1;
            while not Table1.Eof do
            begin
                Table1.Edit;
                Table1.FieldByName('xh').AsInteger:=ii;
                Table1.Post;
                inc(ii);
                Table1.Next;
            end;
        end
        else
        begin
            Table1.Last;
            ii:=1;
            while not Table1.Bof do
            begin
                Table1.Edit;
                Table1.FieldByName('xh').AsInteger:=ii;
                Table1.Post;
                inc(ii);
                Table1.Prior;
            end;
        end;
        Table1.First;
        Table1.EnableControls;
        dbgrid1.Columns[columnindex].Title.Color:=ToSetColor;
    end;
      

  2.   

    给你一个函数,不仅可以正反等排序,而且可以指定从第几位开始排序
    function ListViewRowSort(mListView: TListView; mByte: integer; mDesc: Boolean =
      False): Boolean;
      function ListViewRowSwap(mListView: TListView; mFromRow, mToRow: Integer):
          Boolean;
      var
        S: string;
      begin
        Result := False;
        if (mToRow = mFromRow) then
          Exit;
        if not Assigned(mListView) then
          Exit;
        if (mFromRow < 0) or (mFromRow >= mListView.Items.Count) then
          Exit;
        if (mToRow < 0) or (mToRow >= mListView.Items.Count) then
          Exit;
        try
          S := mListView.Items.Item[mFromRow].Caption;
          mListView.Items.Item[mFromRow].Caption :=
            mListView.Items.Item[mToRow].Caption;
          mListView.Items.Item[mToRow].Caption := S;
        except
          Exit;
        end;
        Result := True;
      end;
    var
      I, J: Integer;
    begin
      Result := False;
      if not Assigned(mListView) then
        Exit;
      for I := 0 to mListView.Items.Count - 2 do
        for J := I + 1 to mListView.Items.Count - 1 do
          if mDesc then
            if RightStr(mListView.Items.Item[I].Caption, mByte) <
              RightStr(mListView.Items.Item[J].Caption, mByte) then
              ListViewRowSwap(mListView, I, J)
            else
          else if RightStr(mListView.Items.Item[I].Caption, mByte) >
            RightStr(mListView.Items.Item[J].Caption, mByte) then
            ListViewRowSwap(mListView, I, J);
      Result := True;
    end;
    参数说明:依次为:ListView,从第几位开始排序,正反排序
      

  3.   

    uses
      CommCtrl;var
        ColumnToSort: Integer;              //全局变量,判断listview列的顺序,用于排序
        SortStyle: Boolean = true;          //控制排序方向的全局变量procedure ShowHeaderIcon;
    var
        h:THandle;
        i:Integer;
        hi:THDItem;
    begin
        h := GetDlgItem(Handle, 0); //get Header Handle
        for i := 0 to Columns.Count - 1 do
        begin
            hi.mask := HDI_FORMAT;
            Header_GetItem(h,i, hi);
            hi.mask := HDI_FORMAT;
            hi.fmt := hi.fmt or HDF_BITMAP_ON_RIGHT;
            Header_SetItem(h,i, hi);
        end;
    end;procedure ListViewOnColumnClick(Sender: TObject; Column: TListColumn);
    begin
      ColumnToSort := Column.Index;
      (Sender as TCustomListView).AlphaSort;
      SortStyle := not SortStyle;
    end;procedure ListViewOnCompare(Sender: TObject; Item1,
      Item2: TListItem; Data: Integer; var Compare: Integer);
    var
      ix,I: Integer;
    begin
      if ColumnToSort = 0 then
        Compare := CompareText(Item1.Caption,Item2.Caption)
      else begin
       ix := ColumnToSort - 1;
       Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
      end;
      
      if SortStyle then
        begin
          Compare:=-Compare;
          if ColumnToSort > 2 then
            Column[ColumnToSort].ImageIndex := 8;
        end
      else
        if ColumnToSort > 2 then
          Column[ColumnToSort].ImageIndex := 7;
      ShowHeaderIcon;                                 //箭头出现在标题右侧
    end;