gpt4 book ai didi

对 ListView 组进行排序?

转载 作者:行者123 更新时间:2023-12-03 15:08:32 26 4
gpt4 key购买 nike

在 ListView 中,项目按组“BGroup”、“CGroup”和“DGroup”进行分组(这些是组标题)。现在,当我向 ListView 添加一个新项目并将标题为“AGroup”的新组分配给该项目时,组“AGroup”始终插入到组的末尾;所以新的组顺序是:BGroup、CGroup、DGroup、AGroup。那么如何才能按正确的字母顺序对组进行排序呢?顺序应为:AGroup、BGroup、CGroup、DGroup。

最佳答案

您可以使用ListView_SortGroups宏,例如该宏期望您拥有自己的比较函数,由 LVGroupCompare 定义。函数原型(prototype)。在以下代码中,组按 Header 排序属性通过使用 CompareText函数,但现在由您来构建自己的比较。

忘记备注了;无论您传递给 ListView_SortGroups 的最后一个 Pointer 类型参数,您将在 LVGroupCompare 中收到宏pvData 参数中的函数,因为这是某个 ListView 的分组排序函数,所以最好直接传递Groups该 ListView 的集合以便于操作。

由于没有直接的方法可以按组 ID 查找 ListView 组,因此我将使用以下辅助函数 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 组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com