如何显示上的TListView列的排序箭头?(How to show the sort arrow

2019-07-19 16:05发布

Windows资源管理器有一个箭头,指示哪个列的列表视图(在报表视图风格)是由在哪个方向(ASC与DESC)排序。

是否有可能以显示对这样的排序指示箭头TListView在Delphi?

Answer 1:

下面是一些简单的代码来标记标题列升序排列:

uses
  Winapi.CommCtrl;

var
  Header: HWND;
  Item: THDItem;
begin
  Header := ListView_GetHeader(ListView1.Handle);
  ZeroMemory(@Item, SizeOf(Item));
  Item.Mask := HDI_FORMAT;
  Header_GetItem(Header, 0, Item);
  Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
  Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag
  Header_SetItem(Header, 0, Item);
end;

我省略了错误检查简单起见。 如果你想在相反方向的箭头,我敢肯定,你可以计算出如何围绕交换逻辑。

关键MSDN主题是,对HDITEM结构。



Answer 2:

您可以轻松地扩展这个代码,使其在一个ListView中的所有列工作; 声明两个变量(形式的私有部分):

ColumnToSort:整数; 升序:布尔;

用0和真实的FORMCREATE程序初始化它们。

procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: ListColumn);
var
  Header: HWND;
  Item: THDItem;
begin
  Header := ListView_GetHeader(ListView1.Handle);
  ZeroMemory(@Item, SizeOf(Item));
  Item.Mask := HDI_FORMAT;

  // Clear the previous arrow
  Header_GetItem(Header, ColumnToSort, Item);
  Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
  Header_SetItem(Header, ColumnToSort, Item);

  if Column.Index = ColumnToSort then
    Ascending := not Ascending
  else
    ColumnToSort := Column.Index;

  // Get the new column
  Header_GetItem(Header, ColumnToSort, Item);
  Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags

  if Ascending then
    Item.fmt := Item.fmt or HDF_SORTUP//include the sort ascending flag
  else
    Item.fmt := Item.fmt or HDF_SORTDOWN;//include the sort descending flag
  Header_SetItem(Header, ColumnToSort, Item);

  with ListView1 do
    begin
      Items.BeginUpdate;
      AlphaSort;
      Items.EndUpdate;
    end;
end;

当然,你必须提供自己的OnCompare功能列的实际排序。 此代码仅显示在所点击列标题中的排序箭头。



文章来源: How to show the sort arrow on a TListView column?