Как изменить порядок групп в TListGroups? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть TListView в стиле vsReport с видимыми группами. Группы отображаются в том порядке, в котором они были созданы. Но я хочу сделать две кнопки (вверх и вниз) и переместить выбранную группу в другую позицию (во время выполнения). Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете сделать это, изменив свойство Index элемента группы. Следующий код демонстрирует использование:

procedure TForm1.btnMoveUpClick(Sender: TObject);
var
  itm: TListItem;
  i: Integer;
begin
  itm := ListView1.Selected;
  if Assigned(itm) then
    for i := 0 to ListView1.Groups.Count - 1 do
      if ListView1.Groups[i].GroupID = itm.GroupID then
      begin
        if ListView1.Groups[i].Index > 0 then
          ListView1.Groups[i].Index := ListView1.Groups[i].Index - 1;
        break;
      end;
end;

procedure TForm1.btnMoveDownClick(Sender: TObject);
var
  itm: TListItem;
  i: Integer;
begin
  itm := ListView1.Selected;
  if Assigned(itm) then
    for i := 0 to ListView1.Groups.Count - 1 do
      if ListView1.Groups[i].GroupID = itm.GroupID then
      begin
        if ListView1.Groups[i].Index < ListView1.Groups.Count - 1 then
          ListView1.Groups[i].Index := ListView1.Groups[i].Index + 1;
        break;
      end;
end;

Сноска: Конечно, это можно (нужно) изменить следующим образом:

function GetGroupFromGroupID(AListView: TListView; AGroupID: integer): TListGroup;
var
  i: Integer;
begin
  for i := 0 to AListView.Groups.Count - 1 do
    if AListView.Groups[i].GroupID = AGroupID then
      Exit(AListView.Groups[i]);
  result := nil;
end;

procedure TForm1.btnMoveUpClick(Sender: TObject);
var
  itm: TListItem;
  grp: TListGroup;
begin
  itm := ListView1.Selected;
  if Assigned(itm) then
  begin
    grp := GetGroupFromGroupID(ListView1, itm.GroupID);
    if Assigned(grp) and (grp.Index > 0) then
      grp.Index := grp.Index - 1;
  end;
end;

procedure TForm1.btnMoveDownClick(Sender: TObject);
var
  itm: TListItem;
  grp: TListGroup;
begin
  itm := ListView1.Selected;
  if Assigned(itm) then
  begin
    grp := GetGroupFromGroupID(ListView1, itm.GroupID);
    if Assigned(grp) and (grp.Index < ListView1.Groups.Count - 1) then
      grp.Index := grp.Index + 1;
  end;
end;
0 голосов
/ 07 мая 2018

Да. Изменяя элемент группы Индекс .

...