Перейти к содержанию
Fire Monkey от А до Я
  • 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;

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

Ссылка на комментарий
  • 0

хммм, оказалось есть одна неприятная вещь, при переходе на 10.3 и отказе от Application.processmessages при первичном старте компоненты не сортируются. Дебаг показал, что у них у всех при первом запуске (Form1.RoomsScrollBox.Content.Children.Items[element] as TEssence).Position.Y = 0;

то есть, я делаю вывод, что пока элементы не отобразились TAlignLayout.top - еще не сработало, они как-бы подвешены в памяти и сортировка поэтому не срабатывает.

Ест какие-нибудь идеи кроме таймера как отрисовать элементы? Сейчас создание и дальнейшая сортировка срабатывают по form.show.  

Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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