2013-02-09 35 views

Trả lời

16

Dưới đây là một số mã đơn giản để đánh dấu một cột tiêu đề như sắp xếp tăng dần:

uses 
    Winapi.CommCtrl; 

var 
    Header: HWND; 
    Item: THDItem; 
begin 
    Header := ListView_GetHeader(ListView1.Handle); 
    ZeroMemory(@Item, SizeOf(Item)); 
    Item.Mask := HDI_FORMAT; 
    Header_GetItem(Header, 0, Item); 
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags 
    Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag 
    Header_SetItem(Header, 0, Item); 
end; 

tôi đã bỏ qua việc kiểm tra lỗi vì lợi ích của sự đơn giản. Nếu bạn muốn mũi tên theo hướng ngược lại, tôi chắc chắn bạn có thể tìm ra cách trao đổi logic xung quanh.

Chủ đề MSDN chính là dành cho cấu trúc HDITEM.

+0

Tôi đã thêm mệnh đề sử dụng Winapi.CommCtrl vào ví dụ của bạn, cảm ơn. –

+0

Có cách nào để thực hiện điều này cho lưới không? –

+1

@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. –

2

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.

+0

Chào mừng bạn đến với stackoverflow. Nói đúng ra đây không phải là câu trả lời cho câu hỏi của tôi. Tuy nhiên, tôi vẫn upvoting nó, bởi vì câu trả lời của bạn rất hữu ích. –

Các vấn đề liên quan