Sto usando Delphi 6 e voglio aggiungere la funzionalità di ordinare un ListView, come è fatto in Windows Explorer.Ordinamento ListView colonne con frecce
In un primo test, ho (Quick & sporco) copiato alcuni codici sorgente da alcune fonti, e fatto alcuni piccoli aggiustamenti:
Questo è quello che ho finora (solo veloce & sporco per ora):
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;
Le colonne possono essere ordinati a monte e verso il basso, ma non riesco a vedere le frecce.
In base a this question, la mia funzione ShowArrowOfListViewColumn() dovrebbe aver risolto il problema.
È possibile che Delphi 6 non supporti questa funzione o ci sia un problema nel mio codice? D'altra parte, ListView è IIRC a Windows control e quindi mi aspetto che WinAPI restituisca la grafica a freccia e non il (molto vecchio) VCL.
Ho letto in un German website che la grafica della freccia deve essere aggiunta manualmente, ma la soluzione di tale sito Web ha l'obbligo di cambiare CommCtrl.pas di Delphi (a causa di un problema tecnico durante il ridimensionamento della colonna). Ma mi piace davvero modifing la fonte VCL, soprattutto perché io sviluppo OpenSource, e io non voglio che altri sviluppatori cambiano/ricompilare le loro fonti di Delphi.
Nota che non ho aggiunto un manifest XP al mio binario, quindi l'app sembra Win9x.
Stai utilizzando comctl v6, ovvero temi XP? Ciò richiede il responsabile dei temi di Mike Lischke. –
Non ho aggiunto un manifest di XP al mio binario, quindi l'app sembra Win9x. –