2013-02-23 4 views
5

ListViewでは、項目はグループ "BGroup"、 "CGroup"、 "DGroup"(これらはグループヘッダー)でグループ化されます。今、私はListViewに新しい項目を追加し、この項目に "AGroup"というヘッダーを持つ新しいグループを割り当てると、グループ "AGroup"は常にグループの最後に挿入されます。新しいグループの順序は、BGroup、CGroup、DGroup、AGroupです。では、どのようにグループを正しいアルファベット順にソートすることができますか?順序は、AGroup、BGroup、CGroup、DGroupでなければなりません。ListViewグループをソートする?

答えて

8

これにはListView_SortGroupsマクロを使用できます。このマクロは、LVGroupCompare関数プロトタイプで定義された独自の比較関数を持つことを期待しています。次のコードでは、グループはHeaderというプロパティでソートされていますが、今度は独自の比較を作成します。

メモを忘れました。 pvDataパラメータのLVGroupCompareファンクションで受け取るListView_SortGroupsマクロの最後のPointer型パラメータに渡すものなので、これは特定のリストビューのグループソート関数になるため、直接Groupsを渡すのが最適です簡単な操作のためのリストビューのコレクション。

グループIDによってリストビューグループを検索する直接的な方法はありませんので、私は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; 

次にあなたがLVGroupCompareで、このヘルパーメソッドを使用することができますこのようにして関数コールバック:

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

ありがとう。私は 『LVGroupCompare』の前に 『@』を追加したときに「正規の手順と方法pointer' :しかし 'E2009互換性のない型:しかし、コンパイラは' ListView_SortGroups'ラインでのエラーを示して 'LVGroupCompare' @、コンパイラは同じ行にエラーを表示します: 'E2036変数が必要です ' – user1580348

+0

そして' LVGroupCompare'は通常のプロシージャとして定義されていますか?それはメソッドにすることはできませんし、ネストするべきではありません。私はコンパイラが満足していたDelphi 2009(これは手作業でDelphi XE2を使用していないため)でこれをテストしました。 – TLama

+1

xe2に問題なし –

関連する問題