use*_*348 5 delphi sorting listview delphi-xe2
在ListView中,项目按组"BGroup","CGroup"和"DGroup"(这些是组头)分组.现在,当我向ListView添加一个新项目并为该项目分配一个标题为"AGroup"的新组时,组"AGroup"总是插在组的末尾; 所以新的组顺序是:BGroup,CGroup,DGroup,AGroup.那么如何才能按正确的字母顺序对组进行排序?顺序应为:AGroup,BGroup,CGroup,DGroup.
您可以使用此ListView_SortGroups宏,例如,此宏希望您拥有自己的比较函数,由LVGroupCompare函数原型定义.在下面的代码中,组Header使用该CompareText函数按属性排序,但现在您可以构建自己的比较.
忘记注意; 无论你传递给你将在参数函数中接收Pointer的ListView_SortGroups宏的最后一个类型参数,因此这将是某个列表视图的组排序函数,最好直接传递该列表视图的集合更容易操作.LVGroupComparepvDataGroups
由于没有按组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;
Run Code Online (Sandbox Code Playgroud)
然后你可以在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;
Run Code Online (Sandbox Code Playgroud)