在ListView中,Items按照"BGroup"、"CGroup"和"DGroup"分组(这些是组标题)。现在,当我向ListView添加一个新的Item并将一个新组与标题"AGroup"分配给该Item时,组"AGroup"总是插入到组的末尾;因此新组的顺序是:BGroup、CGroup、DGroup、AGroup。那么如何按正确的字母顺序对组进行排序呢?顺序应该是:AGroup、BGroup、CGroup、DGroup。
在ListView中,Items按照"BGroup"、"CGroup"和"DGroup"分组(这些是组标题)。现在,当我向ListView添加一个新的Item并将一个新组与标题"AGroup"分配给该Item时,组"AGroup"总是插入到组的末尾;因此新组的顺序是:BGroup、CGroup、DGroup、AGroup。那么如何按正确的字母顺序对组进行排序呢?顺序应该是:AGroup、BGroup、CGroup、DGroup。
ListView_SortGroups
宏来排序,此宏需要您自己定义一个比较函数,并通过LVGroupCompare
函数原型进行定义。在下面的代码中,使用Header
属性和CompareText
函数对组进行排序,但现在您需要构建自己的比较函数。ListView_SortGroups
宏的最后一个Pointer
类型参数,您都将在LVGroupCompare
函数的pvData
参数中接收到,因此,作为某个列表视图的组排序函数,最好直接传递该列表视图的Groups
集合以便更容易地进行操作。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;
ListView_SortGroups
这一行显示错误:E2009 不兼容的类型:'常规过程和方法指针
但是当我在“the LVGroupCompare”之前添加“@”时:@LVGroupCompare
,编译器在同一行显示错误:E2036 需要变量
- user1580348ListView_SortGroups
函数,则会(重复地)调用LVGroupCompare
函数来比较两个现有项,即通过Group1_ID
和Group2_ID
参数传递的两个项。因此,我不相信你可以通过上述代码越界。 - TLamaListView_SortGroups(ListView1.Handle, LVGroupCompare, ListView1.Groups);
没有在LVGroupCompare
前面加上@
。 两种写法(带或不带@
)都可以编译通过。哪一种是正确的? - user1580348TListView.Groups
中的集合ID和列表视图组项的ID之间没有关系。请查看更新以进行修复... - TLama