• 0
Авторизация  
gonzales

Сортировка элементов Скроллбокса

Вопросы

Доброго времени суток!

Ищу изящное решение быстрой сортировки элементов, помещенных в Контент скролбокса. Все элементы имеют свойство SortIndex, чем он выше, тем выше должен быть элемент. Есть куча алгоритмов сортировки, но пока не пойму как их применить при условии того, что все элементы имеют align = top.

Заранее всем спасибо за ответы.

PS. Создать элементы сразу в нужной последовательности невозможно, поэтому нужна именно сортировка уже созданных

Изменено пользователем gonzales

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

  • 0

Пришел на ум такой вариант :

procedure TForm2.FormShow(Sender: TObject);
var
 i : Integer;
 B : TButton ;
begin
 ScrollBox1.BeginUpdate;
 for i := 1 to 10 do
 begin
   B := TButton.Create(Self) ;
   B.Parent := ScrollBox1;
   B.Height := 50;
   B.Align := TAlignLayout.Top ;
   B.Tag := Random(50);
   B.Text := 'Button '+IntToStr(B.Tag);
 end;
 ScrollBox1.EndUpdate;
end;

procedure TForm2.ButtonSortClick(Sender: TObject);
var
 L : TList<Tcontrol>;
 i : Integer;
begin
 L := TList<Tcontrol>.Create;
 for i := 0 to ScrollBox1.Content.ControlsCount-1 do
  L.Add(ScrollBox1.Content.Controls[i]);

 L.Sort(TComparer<TControl>.Construct(
    function(const Left, Right: TControl) : Integer
    begin
      Result := CompareValue(Left.Tag,Right.Tag);
    end));

 for i := 0 to L.Count-1 do
 begin
  L[i].Align := TAlignLayout.None;
  L[i].Position.Y := i* L[i].Height;
  L[i].Align := TAlignLayout.Top;
 end;
 ScrollBox1.RealignContent;
 L.Free;
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Решил вот так, если вдруг кому надо

procedure TForm1.SortGroup;
var
  i, j: integer;
  elementscount: byte;
begin
  elementscount := Form1.RoomsScrollBox.Content.Children.Count;
  for i := 1 to elementscount do
    for j := 0 to elementscount - 1 do
    begin
      if (Form1.RoomsScrollBox.Content.Children.Items[j] as TEssence).SortIndex = i then
      begin
        (Form1.RoomsScrollBox.Content.Children.Items[j] as TEssence).Position.Y := 10000;
        break;
      end;
    end;
end;

соответственно элементы с самым низким индексом будут наверху. Единственное ограничение, что индексы элементов должны быть подряд, без пропусков. Это не очень удобно, надо будет переделать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу