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
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;
- 1. sortowanie listview Sortowanie według określonej kolumny
- 2. Sortowanie różnych grup za pomocą różnych zamówień sortowania w solr
- 3. Sortowanie listView według nazwy produktu za pomocą niestandardowego adaptera?
- 4. Sortowanie modelu pochodnego QAbstractListModel według roli w QML ListView
- 5. sortowanie mysql sortowanie tabeli
- 6. Wpf ListView Czy można zamówić elementy grupy inaczej niż w nagłówkach grup?
- 7. Wykreślanie grup Pandy grup za pomocą podpól i pętli
- 8. Grupa pandypoprzez sortowanie w grupach
- 9. sortowanie cakeph sortowanie malejące najpierw
- 10. Sortowanie radix, sortowanie danych zmiennoprzecinkowych
- 11. android SharedPreferences putStringSet sortowanie/sortowanie
- 12. Dopasowywanie grup w Pythonie
- 13. Przyspieszenie obliczania pobliskich grup?
- 14. Wiele grup w Elasticsearch
- 15. Regex: zamów ignorując grup
- 16. Rozmiary grup roboczych
- 17. Python RegEx wielu grup
- 18. Android - Tworzenie listview z pływającymi nagłówkami
- 19. Zapytanie o sortowanie SQL alchemiczne sortowanie sortowania
- 20. PowerShell Sortowanie z Niestandardowe sortowanie Expression
- 21. Jak wybrać sortowanie bazy danych SQL Server
- 22. Sum kolejnych grup elementów tablicy
- 23. SignalR i dołączanie do grup
- 24. R data.table przecięcie wszystkich grup
- 25. Wyrażenie regularne VBA, zastępowanie grup
- 26. Wyświetlanie wszystkich grup Active Directory
- 27. Używanie wzajemnie wykluczających się grup
- 28. wiele grup w raportach kryształów
- 29. Tworzenie niezależnych grup przycisków opcji
- 30. Tworzenie grup zmiennych w Sass
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
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
nie ma problemu z xe2 –