2013-02-23 13 views
5

W widoku listy elementy są pogrupowane według grup "BGroup", "CGroup" i "DGroup" (są to nagłówki grup). Teraz, kiedy dodaję nową pozycję do ListView i przypisuję nową grupę z nagłówkiem "AGroup" do tej pozycji, grupa "AGroup" jest zawsze wstawiana na końcu grup; więc nowe zamówienie Grupy to: BGroup, CGroup, DGroup, AGroup. Jak mogę więc posortować grupy w prawidłowej kolejności alfabetycznej? Zamówienie powinno być: AGroup, BGroup, CGroup, DGroup.Sortowanie grup ListView?

Odpowiedz

8

Do tego celu można użyć makra ListView_SortGroups, na przykład Makro oczekuje od Ciebie posiadania własnej funkcji porównywania zdefiniowanej przez prototyp funkcji LVGroupCompare. W poniższym kodzie grupy są sortowane według właściwości Header za pomocą funkcji CompareText, ale teraz musisz zbudować własne porównanie.

Zapomniałem zauważyć; cokolwiek przekażesz do ostatniego parametru typu z makra ListView_SortGroups, które otrzymasz w funkcji LVGroupCompare w parametrze pvData, więc będzie to funkcja sortowania grupowego dla określonego widoku listy, najlepiej przekazać bezpośrednio Groups kolekcja tego widoku listy dla łatwiejszej manipulacji.

Ponieważ nie ma bezpośredni sposób znaleźć grupę widoku listy przez ID grupy, użyję następującą funkcję pomocniczą dla klasy TListGroups:

type 
    TListGroups = class(ComCtrls.TListGroups) 
    public 
    function FindItemByGroupID(GroupID: Integer): TListGroup; 
    end; 

implementation 

function TListGroups.FindItemByGroupID(GroupID: Integer): TListGroup; 
var 
    I: Integer; 
begin 
    for I := 0 to Count - 1 do 
    begin 
    Result := Items[I]; 
    if Result.GroupID = GroupID then 
     Exit; 
    end; 
    Result := nil; 
end; 

Następnie można użyć tej metody pomocnika w LVGroupCompare funkcja oddzwaniania w następujący sposób:

function LVGroupCompare(Group1_ID, Group2_ID: Integer; 
    pvData: Pointer): Integer; stdcall; 
var 
    Item1: TListGroup; 
    Item2: TListGroup; 
    Groups: TListGroups; 
begin 
    Result := 0; 
    Groups := TListGroups(pvData); 
    Item1 := Groups.FindItemByGroupID(Group1_ID); 
    Item2 := Groups.FindItemByGroupID(Group2_ID); 
    if Assigned(Item1) and Assigned(Item2) then 
    Result := CompareText(Item1.Header, Item2.Header); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Item: TListItem; 
    Group: TListGroup; 
begin 
    Group := ListView1.Groups.Add; 
    Group.Header := 'AGroup'; 

    Item := ListView1.Items.Add; 
    Item.Caption := 'Item X'; 
    Item.GroupID := Group.ID; 

    ListView_SortGroups(ListView1.Handle, LVGroupCompare, ListView1.Groups); 
end; 
+0

Dziękuję. Jednak kompilator pokazuje błąd w linii 'ListView_SortGroups': ' Niekompatybilne typy E2009: 'Procedura regularna i wskaźnik metody' Ale kiedy dodaję znak "@" przed "LVGroupCompare": '@ LVGroupCompare', kompilator pokazuje błąd w tej samej linii: 'Wymagana zmienna E2036' – user1580348

+0

A czy masz' LVGroupCompare' zdefiniowaną jako zwykła procedura (tak jak ja)? Nie może być metodą i nie powinien być zagnieżdżony. Przetestowałem to właśnie z Delphi 2009 (ponieważ nie mam ręcznie Delphi XE2), gdzie kompilator był zadowolony. – TLama

+1

nie ma problemu z xe2 –

Powiązane problemy