Как показать стрелку сортировки в столбце 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 для фактической сортировки столбцов. В этом коде отображается только стрелка сортировки в заголовке столбца.