Bạn có thể dễ dàng mở rộng mã này để làm cho mã hoạt động cho tất cả các cột trong một ListView; Khai báo hai biến (trong phần riêng tư của Biểu mẫu):
ColumnToSort: Integer; Tăng dần: Boolean;
Khởi tạo chúng trong thủ tục FormCreate bằng 0 và 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;
Tất nhiên, bạn sẽ phải cung cấp chức năng OnCompare của riêng bạn để sắp xếp thực tế các cột. Mã này chỉ hiển thị mũi tên sắp xếp trong tiêu đề cột được nhấp.
Nguồn
2014-02-16 02:48:52
Tôi đã thêm mệnh đề sử dụng Winapi.CommCtrl vào ví dụ của bạn, cảm ơn. –
Có cách nào để thực hiện điều này cho lưới không? –
@No Grids là các điều khiển tùy chỉnh, được triển khai hoàn toàn trong mã VCL. Nếu VCL không cung cấp một cơ sở như vậy, thì bạn phải tùy chỉnh bức tranh trong mã của bạn. –