2013-02-23 2 views
5

In einer ListView werden die Elemente nach den Gruppen "BGroup", "CGroup" und "DGroup" gruppiert (Dies sind die Gruppenköpfe). Wenn ich nun ein neues Item zum ListView hinzufüge und diesem Item eine neue Gruppe mit der Kopfzeile "AGroup" zuteile, wird immer die Gruppe "AGroup" am Ende der Gruppen eingefügt; Die neue Gruppenbestellung lautet also: BGroup, CGroup, DGroup, AGroup. Wie kann ich die Gruppen in alphabetischer Reihenfolge sortieren lassen? Die Reihenfolge sollte lauten: AGroup, BGroup, CGroup, DGroup.Listenansichtsgruppen sortieren?

Antwort

8

Sie können das ListView_SortGroups Makro für diese z. Dieses Makro erwartet von Ihnen eine eigene Vergleichsfunktion, definiert durch den Funktionsprototyp LVGroupCompare. Im folgenden Code werden die Gruppen nach der Header-Eigenschaft sortiert, indem die CompareText-Funktion verwendet wird. Jetzt liegt es an Ihnen, einen eigenen Vergleich zu erstellen.

Vergessen zu beachten; was auch immer Sie an den letzten Pointer Typ Parameter des ListView_SortGroups Makro übergeben werden Sie in der LVGroupCompare Funktion im pvData Parameter erhalten, so wie dies eine Gruppensortierfunktion einer bestimmten Listenansicht sein wird, ist es das Beste, direkt Groups zu übergeben Sammlung dieser Listenansicht zur einfacheren Handhabung.

Da es keine direkte Möglichkeit ist eine Listenansicht Gruppe von Gruppen-ID zu finden, würde ich die folgende Hilfsfunktion für die TListGroups Klasse verwenden:

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; 

Dann können Sie diese Hilfsmethode in der Verwendung LVGroupCompare Funktion Rückruf auf diese Weise:

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

Vielen Dank. Der Compiler zeigt jedoch einen Fehler in der Zeile 'ListView_SortGroups' an: 'E2009 Inkompatible Typen:' Normaler Verfahrens- und Methodenzeiger ' Wenn ich jedoch ein" @ "vor" LVGroupCompare "hinzufüge:' @ LVGroupCompare', dann Compiler zeigt den Fehler in der gleichen Zeile: 'E2036 Variable required' – user1580348

+0

Und Sie haben die' LVGroupCompare' als reguläres Verfahren definiert (wie ich)? Es kann keine Methode sein und sollte nicht verschachtelt sein. Ich habe dies nur mit Delphi 2009 getestet (da ich Delphi XE2 jetzt nicht von Hand habe), wo der Compiler zufrieden war. – TLama

+1

kein Problem mit xe2 –