2013-02-09 25 views

Odpowiedz

16

Oto niektóre proste kod, aby zaznaczyć kolumnę nagłówka posortowane rosnąco:

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; 

I pominięto błąd sprawdzania uproszczenia. Jeśli chcesz strzały w przeciwną stronę, jestem pewien, że możesz wymyślić, jak zamienić logikę.

Kluczowym tematem MSDN jest temat dla struktury HDITEM.

+0

Dodałem klauzulę użycia Winapi.CommCtrl do twojego przykładu, dziękuję. –

+0

Czy jest to możliwe w przypadku sieci? –

+1

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

2

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.

+0

Witamy w stackoverflow. Ściśle mówiąc nie jest to odpowiedź na moje pytanie. Wciąż go przegrywam, ponieważ twoja odpowiedź jest przydatna. –

Powiązane problemy