È possibile estendere facilmente questo codice per farlo funzionare per tutte le colonne in un controllo ListView; Dichiarare due variabili (nella sezione privata del modulo):
ColumnToSort: Integer; Ascendente: booleano;
Inizializzarli nella procedura FormCreate con 0 e True.
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: ListColumn);
var
Header: HWND;
Item: THDItem;
begin
Header := ListView_GetHeader(ListView1.Handle);
ZeroMemory(@Item, SizeOf(Item));
Item.Mask := HDI_FORMAT;
// Clear the previous arrow
Header_GetItem(Header, ColumnToSort, Item);
Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
Header_SetItem(Header, ColumnToSort, Item);
if Column.Index = ColumnToSort then
Ascending := not Ascending
else
ColumnToSort := Column.Index;
// Get the new column
Header_GetItem(Header, ColumnToSort, Item);
Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags
if Ascending then
Item.fmt := Item.fmt or HDF_SORTUP//include the sort ascending flag
else
Item.fmt := Item.fmt or HDF_SORTDOWN;//include the sort descending flag
Header_SetItem(Header, ColumnToSort, Item);
with ListView1 do
begin
Items.BeginUpdate;
AlphaSort;
Items.EndUpdate;
end;
end;
Naturalmente, si dovrà fornire la propria funzione OnCompare per l'ordinamento effettivo delle colonne. Questo codice visualizza solo la freccia di ordinamento nell'intestazione della colonna selezionata.
fonte
2014-02-16 02:48:52
Ho aggiunto la clausola Winapi.CommCtrl utilizza l'esempio, grazie. –
C'è un modo per farlo per le griglie? –
@No Le griglie sono controlli personalizzati, interamente implementati nel codice VCL. Se il VCL non offre una tale struttura, allora dovresti personalizzare il dipinto nel tuo codice. –