2013-02-23 45 views
5

在ListView中,項目按組「BGroup」,「CGroup」和「DGroup」分組(這些是組標題)。現在,當我向ListView添加一個新項目併爲此項目分配一個頭部爲「AGroup」的新組時,組「AGroup」總是插入到組的末尾;所以新的組的順序是:BGroup,CGroup,DGroup,AGroup。那麼我怎樣才能讓這些組按正確的字母順序排序呢?順序應該是:AGroup,BGroup,CGroup,DGroup。排序ListView組?

回答

8

您可以使用此宏例如ListView_SortGroups。這個宏期望你有自己的比較函數,由LVGroupCompare函數原型定義。在下面的代碼中,通過使用CompareText函數,這些組按Header屬性排序,但現在讓您可以構建自己的比較。

忘記了;不管你傳遞給ListView_SortGroups宏的最後一個Pointer類型參數,你會在pvData參數中的LVGroupCompare函數中收到,因此這將成爲某個列表視圖的組排序功能,所以最好直接傳遞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使用此helper方法函數回調這種方式:

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

謝謝。但是,編譯器在'ListView_SortGroups'行顯示錯誤: 'E2009不兼容類型:'常規過程和方法指針' 但是,當我在「LVGroupCompare」之前添加「@」@「LVGroupCompare」時,編譯器在同一行顯示錯誤: 'E2036需要變量' – user1580348 2013-02-23 15:34:15

+0

你有'LVGroupCompare'定義爲一個常規程序(我有)?它不能是一種方法,不應該嵌套。我已經用Delphi 2009測試過了(因爲我現在手頭沒有Delphi XE2),編譯器很滿意。 – TLama 2013-02-23 15:44:16

+1

xe2沒有問題 – 2013-02-23 15:59:36