Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
gonzales

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

Вопрос

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

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

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

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

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

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


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

Рекомендуемые сообщения

  • 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;

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Авторизация  

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

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

×
×
  • Создать...