5

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

4

1 回答 1

8

您可以为此使用ListView_SortGroups宏,例如,此宏希望您有自己的比较函数,由LVGroupCompare函数原型定义。在以下代码中Header,使用该CompareText函数按属性对组进行排序,但现在由您来构建自己的比较。

忘记注意了;无论您传递给宏的最后一个Pointer类型参数,ListView_SortGroups您都将在参数中的LVGroupCompare函数中收到pvData,因此这将是某个列表视图的组排序函数,最好直接传递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然后你可以通过这种方式在函数回调中使用这个辅助方法:

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;
于 2013-02-23T15:10:10.010 回答