2013-02-23 26 views
5

Bir ListView'de, Öğeler "BGroup", "CGroup" ve "DGroup" gruplarına göre gruplandırılır (Bunlar grup üstbilgileridir). Şimdi, ListView'e yeni bir Öğe eklediğimde ve bu Öğeye "AGroup" başlığına sahip yeni bir grup atadığımda, "AGroup" grubu her zaman grupların sonuna eklenir; Yani yeni Gruplar sırası: BGroup, CGroup, DGroup, AGroup. Peki grupları doğru alfabetik sıraya göre nasıl alabilirim? Sipariş şöyle olmalıdır: AGroup, BGroup, CGroup, DGroup.ListView Gruplarını Sıralama?

cevap

8

Bu örnekteki gibi ListView_SortGroups makrosunu kullanabilirsiniz. Bu makro, sizden LVGroupCompare işlev prototipiyle tanımlanan kendi karşılaştırma işlevinize sahip olmanızı bekler. Aşağıdaki kodda gruplar, CompareText işlevini kullanarak Header özelliğine göre sıralanmıştır, ancak şimdi kendi karşılaştırmanızı oluşturmak üzeredir.

Unutulmaması gereken noktalar; pvData parametresindeki LVGroupCompare parametresinde makrosunun son Pointer tür parametresine geçen her ne olursa olsun, bu, belirli bir liste görünümünün bir grup sıralama işlevi olacak, doğrudan doğruya Groups Daha kolay manipülasyon için bu liste görünümünün toplanması. grup kimliğine göre bir liste görünümü grubu bulmak için doğrudan bir yol yoktur yana

, ben TListGroups sınıf için aşağıdaki yardımcı işlevi kullanmak istiyorum:

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; 

Sonra LVGroupCompare bu yardımcı yöntemini kullanabilirsiniz Bu işlev çağrısı:

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

Teşekkür ederiz. Ancak, derleyici 'ListView_SortGroups 'satırında bir hata gösterir: ' E2009 Uyumsuz Türler:' Düzenli yordam ve yöntem işaretçisi ' Ama "LVGroupCompare" önce bir "@" eklediğimde: @ LVGroupCompare' derleyici aynı satırdaki hatayı gösterir: 'E2036 Değişken gerekli ' – user1580348

+0

Ve' LVGroupCompare 'normal bir yordam olarak tanımlanmış mı (sahip olduğum gibi)? Bu bir yöntem olamaz ve iç içe olmamalıdır. Bunu derhal Delphi 2009 ile test ettim (derhal Delphi XE2 elimde olmadığından). – TLama

+1

xe2 ile sorun yok –