Как показать стрелку сортировки в столбце TListView?
Проводник Windows имеет стрелку, указывающую, по какому столбцу сортируется представление списка (в стиле представления отчета) и в каком направлении (ASC против DESC).
можно ли отобразить стрелку индикации сортировки на TListView
в Делфи?
2 ответов
вот простой код для обозначения заголовков столбцов, как по возрастанию:
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
структура.
вы можете легко расширить этот код, чтобы он работал для всех столбцов в ListView; объявите две переменные (в частном разделе Формы):
ColumnToSort: Целое Число; Возрастание: Boolean;
инициализируйте их в процедуре 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 для фактической сортировки столбцов. В этом коде отображается только стрелка сортировки в заголовке столбца.