使用箭头对ListView列进行排序

Dan*_*all 5 delphi winapi delphi-6

我正在使用Delphi 6并希望添加对ListView进行排序的功能,就像在Windows资源管理器中完成一样.

在第一次测试中,我(快速和脏)从几个来源复制了一些源代码,并做了一些小的调整:

这是我到目前为止(现在只有快速和脏):

uses
  CommCtrls;

var
  Descending: Boolean;
  SortedColumn: Integer;

const
  { For Windows >= XP }
  {$EXTERNALSYM HDF_SORTUP}
  HDF_SORTUP              = $0400;
  {$EXTERNALSYM HDF_SORTDOWN}
  HDF_SORTDOWN            = $0200;

procedure ShowArrowOfListViewColumn(ListView1: TListView; ColumnIdx: integer; Descending: boolean);
var
  Header: HWND;
  Item: THDItem;
begin
  Header := ListView_GetHeader(ListView1.Handle);
  ZeroMemory(@Item, SizeOf(Item));
  Item.Mask := HDI_FORMAT;
  Header_GetItem(Header, ColumnIdx, Item);
  Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
  if Descending then
    Item.fmt := Item.fmt or HDF_SORTDOWN
  else
    Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag
  Header_SetItem(Header, ColumnIdx, Item);
end;

procedure TUD2MainForm.ListView3Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  if SortedColumn = 0 then
    Compare := CompareText(Item1.Caption, Item2.Caption)
  else
    Compare := CompareText(Item1.SubItems[SortedColumn-1], Item2.SubItems[SortedColumn-1]);
  if Descending then Compare := -Compare;
end;

procedure TUD2MainForm.ListView3ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  TListView(Sender).SortType := stNone;
  if Column.Index<>SortedColumn then
  begin
    SortedColumn := Column.Index;
    Descending := False;
  end
  else
    Descending := not Descending;
  ShowArrowOfListViewColumn(TListView(Sender), column.Index, Descending);
  TListView(Sender).SortType := stText;
end;
Run Code Online (Sandbox Code Playgroud)

colums可以上下排序,但我看不到箭头.

根据这个问题,我的函数ShowArrowOfListViewColumn()应该已经解决了这个问题.

Delphi 6是否可能不支持此功能,或者我的代码中是否存在问题?另一方面,ListView是IIRC的Windows控件,因此我希望WinAPI呈现箭头图形,而不是(非常旧的)VCL.

我在德国网站上看到箭头图形必须手动添加,但该网站的解决方案需要更改Delphi的CommCtrl.pas(因为在调整列时出现故障).但我真的不喜欢修改VCL源代码,特别是因为我开发OpenSource,我不希望其他开发人员改变/重新编译他们的Delphi Sources.

请注意,我并没有表现一个XP添加到我的二进制文件,因此应用程序看起来像Win9x的.

Dav*_*nan 4

HDF_SORTDOWNHDF_SORTUP需要 comctl32 v6。文档中对此进行了说明HDITEM

HDF_SORTDOWN版本 6.00 及更高版本。在该项目上绘制一个向下箭头。这通常用于指示当前窗口中的信息在此列上按降序排序。该标志不能与 HDF_IMAGE 或 HDF_BITMAP 组合使用。

HDF_SORTUP版本 6.00 及更高版本。在此项目上绘制向上箭头。这通常用于指示当前窗口中的信息在此列上按升序排序。该标志不能与 HDF_IMAGE 或 HDF_BITMAP 组合使用。

正如您在评论中所解释的,您没有包含 comctl32 v6 清单。这解释了你所观察到的情况。

解决方案包括:

  • 添加 comctl32 v6 清单,或者
  • 自定义绘图标题箭头。