2013-02-09 35 views

回答

16

下面是一些簡單的代碼來標記的報頭列排序升序:

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結構。

+0

我在您的示例中添加了Winapi.CommCtrl使用子句,謝謝。 – 2013-02-09 23:26:51

+0

有沒有辦法做到這一點的網格? – 2013-02-10 08:23:30

+1

@No網格是自定義控件,完全以VCL代碼實現。如果VCL不提供這樣的設施,那麼您必須在代碼中自定義繪畫。 – 2013-02-10 09:03:13

2

您可以輕鬆擴展此代碼以使其適用於ListView中的所有列;聲明兩個變量(在Form的私有部分中):

ColumnToSort:Integer; 升序:布爾型;

使用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。嚴格地說,這不是我的問題的答案。無論如何,我都會投票贊成,因爲你的回答很有用。 – 2014-02-16 10:18:23