Windowsエクスプローラーには、リストビュー(レポートビュースタイル)がどの列でどの方向(ASCとDESC)で並べ替えられているかを示す矢印があります。
TListView
Delphiでそのようなソート表示矢印を表示することは可能ですか?
Windowsエクスプローラーには、リストビュー(レポートビュースタイル)がどの列でどの方向(ASCとDESC)で並べ替えられているかを示す矢印があります。
TListView
Delphiでそのようなソート表示矢印を表示することは可能ですか?
ヘッダー列を昇順で並べ替えられたものとしてマークする簡単なコードを次に示します。
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のすべての列で機能するようにすることができます。(フォームのプライベートセクションで)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関数を用意する必要があります。このコードは、クリックされた列ヘッダーにソート矢印のみを表示します。