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_SortGroupsLVGroupComparepvDataGroups

グループ 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 に答える