Windows資源管理器有一個箭頭,指示列表視圖(在報表視圖樣式中)按哪個方向排序(ASC與DESC)。如何在TListView列上顯示排序箭頭?
是否可以在Delphi中的TListView
上顯示這樣的排序指示箭頭?
Windows資源管理器有一個箭頭,指示列表視圖(在報表視圖樣式中)按哪個方向排序(ASC與DESC)。如何在TListView列上顯示排序箭頭?
是否可以在Delphi中的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;
我已經省略錯誤檢查簡單起見。如果你想在相反方向使用箭頭,我相信你可以研究如何交換邏輯。
關鍵的MSDN主題是HDITEM
結構。
您可以輕鬆擴展此代碼以使其適用於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功能列的實際排序。此代碼僅在點擊的列標題中顯示排序箭頭。
歡迎使用stackoverflow。嚴格地說,這不是我的問題的答案。無論如何,我都會投票贊成,因爲你的回答很有用。 – 2014-02-16 10:18:23
我在您的示例中添加了Winapi.CommCtrl使用子句,謝謝。 – 2013-02-09 23:26:51
有沒有辦法做到這一點的網格? – 2013-02-10 08:23:30
@No網格是自定義控件,完全以VCL代碼實現。如果VCL不提供這樣的設施,那麼您必須在代碼中自定義繪畫。 – 2013-02-10 09:03:13