6

Windowsエクスプローラーには、リストビュー(レポートビュースタイル)がどの列でどの方向(ASCとDESC)で並べ替えられているかを示す矢印があります。

TListViewDelphiでそのようなソート表示矢印を表示することは可能ですか?

4

2 に答える 2

17

ヘッダー列を昇順で並べ替えられたものとしてマークする簡単なコードを次に示します。

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構造体に関するものです。

于 2013-02-09T22:37:16.910 に答える
3

このコードを簡単に拡張して、ListViewのすべての列で機能するようにすることができます。(フォームのプライベートセクションで)2つの変数を宣言します。

ColumnToSort:整数; 昇順:ブール値;

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関数を用意する必要があります。このコードは、クリックされた列ヘッダーにソート矢印のみを表示します。

于 2014-02-16T02:48:52.127 に答える