Ich benutze Delphi 6 und möchte die Funktionalität zum Sortieren eines ListView hinzufügen, wie es im Windows Explorer gemacht wird.ListView-Spalten mit Pfeilen sortieren
In einem ersten Test, ich habe (quick & schmutzig) ein paar Quellcodes von einigen Quellen kopiert und einige kleine Anpassungen vorgenommen:
Das ist, was ich bisher haben (nur schnell & schmutzig für jetzt):
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;
Die colums sortiert nach oben und unten werden kann, aber ich kann nicht Pfeile sehen.
Nach this question sollte meine Funktion ShowArrowOfListViewColumn() das Problem gelöst haben.
Ist es möglich, dass Delphi 6 diese Funktion nicht unterstützt, oder gibt es ein Problem in meinem Code? Auf der anderen Seite ist ListView IIRC ein Windows control, und daher erwarte ich, dass die WinAPI die Pfeilgrafiken und nicht die (sehr alte) VCL rendert.
Ich lese unter German website, dass die Pfeilgrafiken manuell hinzugefügt werden müssen, aber die Lösung dieser Website hat die Anforderung, CommCtrl.pas von Delphi zu ändern (wegen eines Fehlers beim Ändern der Größe der Spalte). Aber ich mag es wirklich nicht, die VCL-Quelle zu ändern, besonders seit ich OpenSource entwickle, und ich möchte nicht, dass andere Entwickler ihre Delphi-Quellen ändern/neu kompilieren.
Beachten Sie, dass ich meiner Binärdatei kein XP-Manifest hinzugefügt habe, daher sieht die App wie Win9x aus.
Verwenden Sie comctl v6, d. H. XP Themes? Das erfordert Mike Lischkes Themenmanager. –
Ich habe meiner Binärdatei kein XP-Manifest hinzugefügt, daher sieht die App wie Win9x aus. –