我正在使用Delphi 6並希望添加對ListView進行排序的功能,就像它在Windows資源管理器中所做的那樣。使用箭頭排序ListView列
在第一測試中,我有(快速&髒)複製從幾個來源幾個源代碼,並做了一些小的調整:
這是我到目前爲止(僅快&髒現在):
uses
CommCtrls;
var
Descending: Boolean;
SortedColumn: Integer;
const
{ For Windows >= XP }
{$EXTERNALSYM HDF_SORTUP}
HDF_SORTUP = $0400;
{$EXTERNALSYM HDF_SORTDOWN}
HDF_SORTDOWN = $0200;
procedure ShowArrowOfListViewColumn(ListView1: TListView; ColumnIdx: integer; Descending: boolean);
var
Header: HWND;
Item: THDItem;
begin
Header := ListView_GetHeader(ListView1.Handle);
ZeroMemory(@Item, SizeOf(Item));
Item.Mask := HDI_FORMAT;
Header_GetItem(Header, ColumnIdx, Item);
Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
if Descending then
Item.fmt := Item.fmt or HDF_SORTDOWN
else
Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag
Header_SetItem(Header, ColumnIdx, Item);
end;
procedure TUD2MainForm.ListView3Compare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
begin
if SortedColumn = 0 then
Compare := CompareText(Item1.Caption, Item2.Caption)
else
Compare := CompareText(Item1.SubItems[SortedColumn-1], Item2.SubItems[SortedColumn-1]);
if Descending then Compare := -Compare;
end;
procedure TUD2MainForm.ListView3ColumnClick(Sender: TObject;
Column: TListColumn);
begin
TListView(Sender).SortType := stNone;
if Column.Index<>SortedColumn then
begin
SortedColumn := Column.Index;
Descending := False;
end
else
Descending := not Descending;
ShowArrowOfListViewColumn(TListView(Sender), column.Index, Descending);
TListView(Sender).SortType := stText;
end;
colums可以向上和向下排序,但我看不到箭頭。
根據this question,我的函數ShowArrowOfListViewColumn()應該已經解決了這個問題。
Delphi 6是否可能不支持此功能,或者在我的代碼中存在問題?另一方面,ListView是IIRC a Windows control,因此我期望WinAPI呈現箭頭圖形,而不是(非常陳舊的)VCL。
我在German website上看到箭頭圖形必須手動添加,但該網站的解決方案需要更改Delphi的CommCtrl.pas(由於調整列大小時會出現毛刺)。但我真的不喜歡修改VCL源代碼,尤其是在我開發OpenSource之後,我不希望其他開發人員更改/重新編譯他們的Delphi源代碼。
請注意,我沒有將XP清單添加到我的二進制文件,所以該應用程序看起來像Win9x。
您是否使用comctl v6,即XP主題?這需要Mike Lischke的主題經理。 –
我沒有將XP清單添加到我的二進制文件,所以該應用程序看起來像Win9x。 –