2013-02-09 14 views

risposta

16

Ecco qualche semplice codice per contrassegnare una colonna di intestazione come ascendente filtrate:

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; 

ho omesso il controllo di errori per semplicità. Se vuoi la freccia nella direzione opposta, sono sicuro che puoi capire come scambiare la logica in giro.

L'argomento chiave MSDN è quello per la struttura HDITEM.

+0

Ho aggiunto la clausola Winapi.CommCtrl utilizza l'esempio, grazie. –

+0

C'è un modo per farlo per le griglie? –

+1

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

2

È 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.

+0

Benvenuti in StackOverflow. A rigor di termini questa non è una risposta alla mia domanda. Lo sto inviando comunque, perché la tua risposta è utile. –

Problemi correlati