当用ListView排序时,点击列标头时(Column),如何实现指示升序和降序的三角图标?象Windows中的我的电脑、FoxMail等中的ListView排序!尽量有源代码呈现。

解决方案 »

  1.   

    排序用ListViewColumnClick和ListViewCompare,看一下delphi自带的帮助!
    图标用imaglist参考下面:
    procedure TMainForm.ListViewColumnClick(Sender: TObject;
      Column: TListColumn);
    begin
      if nSortCol= Column.Index then
        AscSort:= not AscSort
      else
        AscSort:= True;
      nSortCol := Column.Index;
      ListView.AlphaSort;
    end;procedure TMainForm.ListViewCompare(Sender: TObject; Item1,
      Item2: TListItem; Data: Integer; var Compare: Integer);
    CONST
     (* ListView1 Column Headers *)
      COLUMN_FILENAME   = 0;
      COLUMN_SIZE    = 4;
      COLUMN_ATTR    = 3;
      COLUMN_MODIFYDATE     = 5;
    var
      size1,size2:integer;
      Result: INTEGER;
    begin
      ListView.HeaderSortColumn:=nSortCol;
         case nSortCol of
           COLUMN_FILENAME:
             Result := CompareText(Item1.Caption,Item2.Caption);
           COLUMN_SIZE:
              begin
              size1 := StrToInt( Item1.SubItems.Strings [ nSortCol - 1 ] );
              size2 := StrToInt( Item2.SubItems.Strings [ nSortCol - 1 ] );
              Result := ( size1 - size2 );
              end;
         else
           Result := CompareText(Item1.SubItems[nSortCol - 1],Item2.SubItems[nSortCol - 1]);
         end;  IF AscSort THEN
     
        Compare :=Result;
       
      else
      
        Compare := -Result;
        
    end;图标只有你自己找了:)
      

  2.   

    排序我已经实现了,基本和你的代码相同。
    图标必须自己画上去吗?有没有更方便的方法?代码case中COLUMN_SIZE=4中那部分有什么用?
      

  3.   

    1、用ImageList1找几个图标就可以了
    2、定义列的大小
      

  4.   

    **********抢分行动***********
    碰到问题查不到,花了半天时间作了一个,不敢独享。
    ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn);
    function FindColumn(Grid:TDbGrid;Name:string):TColumn;
    var
      i:integer;
    begin
      Result:=nil;
      for i:=0 to Grid.Columns.Count-1 do
        if Grid.Columns.Items[i].FieldName=Name then
          Result:=Grid.Columns.Items[i];
    end;
    var
      DataSet:TClientDataSet;
      ASC:boolean;      
      Clm:TColumn;
    begin
      DataSet:=TClientDataSet(Column.Field.DataSet);
      if Assigned(DataSet) and (not DataSet.IsEmpty) then
      begin
        if DataSet.IndexName=Column.Fieldname then
          ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil;
        Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
        if Assigned(Clm) then
        begin
          DataSet.DeleteIndex(DataSet.IndexName);
          Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
        end;
        if Asc then
        begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,
                          [ixCaseInsensitive,ixDescending]);
          Column.Title.Caption:=Column.Title.Caption+'▲';
        end
        else begin
          DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]);
          Column.Title.Caption:=Column.Title.Caption+'▼';
        end;
        DataSet.IndexName:=Column.Fieldname;
      end;
    end;