Я использую Delphi 6 и хочу добавить функциональность сортировки ListView, как это делается в проводнике Windows.
В первом тесте я (быстро и грязно) скопировал несколько исходных кодов из нескольких источников и внес небольшие изменения:
Это то, что у меня есть до сих пор (только быстро и грязно):
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 — это IIRC a Управление Windows, и поэтому я ожидаю, что WinAPI отрисовывает графику со стрелками, а не (очень старый) VCL.
Я прочитал на немецком веб-сайте, что графику со стрелкой нужно добавлять вручную, но решение на этом веб-сайте требуется изменить CommCtrl.pas Delphi (из-за сбоя при изменении размера столбца). Но мне очень не нравится изменять исходный код VCL, тем более что я разрабатываю OpenSource, и я не хочу, чтобы другие разработчики изменяли/перекомпилировали свои исходные коды Delphi.
Обратите внимание, что я не добавил манифест XP в свой двоичный файл, поэтому приложение выглядит как Win9x.