2013-02-09 2 views
5

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

このような並べ替えの矢印を、デルファイの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; 

答えて

16

はここにソート昇順としてヘッダ列をマークするために、いくつかの簡単なコードです。反対方向に矢印が必要な場合は、論理を交換する方法を考え出すことができます。

キーMSDNのトピックは、HDITEM構造体のトピックです。

+0

私はあなたの例にWinapi.CommCtrl uses句を追加しました。ありがとうございます。 –

+0

グリッドでこれを行う方法はありますか? –

+1

@Noグリッドはカスタムコントロールで、完全にVCLコードで実装されています。 VCLがそのような機能を提供しない場合は、コード内でペイントをカスタマイズする必要があります。 –

2

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

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

0とTrueでFormCreateプロシージャで初期化します。

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

+0

ようこそstackoverflowへ。厳密に言えば、これは私の質問に対する答えではありません。あなたの答えが有用であるので、私はそれをとにかくupvotingしています。 –

関連する問題