在ListView中,项目按组“BGroup”,“CGroup”和“DGroup”(这些是组头)分组.现在,当我向ListView添加一个新项目并为该项目分配一个标题为“AGroup”的新组时,组“AGroup”总是插在组的末尾;所以新的组顺序是:BGroup,CGroup,DGroup,AGroup.那么如何才能按正确的字母顺序对组进行排序?顺序应为:AGroup,BGroup,DGroup.
解决方法
你可以使用
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;