I am using Delphi 6 and want to add the functionality of sorting a ListView, like it is done in Windows Explorer.
In a first test, I have (quick&dirty) copied a few source codes from a few sources, and done some small adjustments:
This is what I have so far (only quick&dirty for now):
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;
The colums can be sorted up- and downwards, but I can't see arrows.
According to this question , my function ShowArrowOfListViewColumn() should have solved the problem.
Is it possible that Delphi 6 does not support this feature, or is there a problem in my code? On the other hand, ListView is IIRC a Windows control, and therefore I expect that the WinAPI renders the arrow graphics, and not the (very old) VCL.
I read at a German website that the arrow graphics have to be added manually, but the solution of that website has the requirement to change CommCtrl.pas of Delphi (because of a glitch when resizing column). But I really dislike modifing the VCL source, especially since I develop OpenSource, and I do not want that other developers change/recompile their Delphi Sources.
Note that I didn't add a XP manifest to my binary, so the app looks like Win9x.
HDF_SORTDOWN
and HDF_SORTUP
require comctl32 v6. This is stated in the documentation for HDITEM
:
HDF_SORTDOWN Version 6.00 and later. Draws a down-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in descending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
HDF_SORTUP Version 6.00 and later. Draws an up-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in ascending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
As you explained in your comments, you did not include the comctl32 v6 manifest. That explains what you observe.
Solutions include: