在第一次测试中,我(草率地)从几个来源复制了一些源代码,并进行了一些小的调整:
目前我只有以下内容(仅限草率版):
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;
这些列可以向上和向下排序,但我看不到箭头。
根据这个问题,我的ShowArrowOfListViewColumn()函数应该解决了这个问题。
是否可能Delphi 6不支持此功能,或者我的代码有问题?另一方面,ListView是一个Windows控件,因此我希望WinAPI渲染箭头图形,而不是(非常古老的)VCL。
我在德语网站上读到,箭头图形必须手动添加,但该网站的解决方案要求更改Delphi的CommCtrl.pas(因为调整列大小时出现故障)。但我真的不喜欢修改VCL源代码,特别是因为我开发OpenSource,并且不希望其他开发人员更改/重新编译其Delphi源代码。
请注意,我没有将XP清单添加到我的二进制文件中,因此该应用程序看起来像Win9x。