在Windows资源管理器的报表视图中,有一个箭头指示列表视图按哪一列排序以及排序的方向(升序还是降序)。
在Delphi中,是否可以在TListView
上显示这样的排序指示箭头?
在Windows资源管理器的报表视图中,有一个箭头指示列表视图按哪一列排序以及排序的方向(升序还是降序)。
在Delphi中,是否可以在TListView
上显示这样的排序指示箭头?
这是一些简单的代码,用于将标题列标记为按升序排序:
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
结构。
ColumnToSort:整数; Ascending:布尔值;
在FormCreate过程中将它们初始化为0和True。
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函数来实际排序列。此代码仅在单击的列标题中显示排序箭头。