Możesz łatwo rozszerzyć ten kod, aby działał dla wszystkich kolumn w ListView; Zadeklaruj dwie zmienne (w prywatnej sekcji formularza):
ColumnToSort: Integer; Rosnąco: Boolean;
Zainicjuj je w procedurze FormCreate za pomocą 0 i 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;
Oczywiście trzeba będzie podać własną funkcję OnCompare dla faktycznego sortowania kolumn. Ten kod wyświetla tylko strzałkę sortującą w nagłówku kolumny kliknięcia.
Dodałem klauzulę użycia Winapi.CommCtrl do twojego przykładu, dziękuję. –
Czy jest to możliwe w przypadku sieci? –
@No Grids to niestandardowe elementy sterujące, całkowicie zaimplementowane w kodzie VCL. Jeśli VCL nie oferuje takiego obiektu, musisz dostosować obraz w swoim kodzie. –