Анимация добавления строки в список в FireMonkey

следующий код красиво анимирует добавление новой строки в конец списка

procedure TForm6.AddItem(s: string);
var
  l : TListBoxItem;
  OldHeight : Single;
begin
  l := TListBoxItem.Create(Self);
  l.Text := s;
  OldHeight := l.Height;
  l.Height := 0;
  l.Parent := ListBox1;
  l.Opacity := 0;
  l.AnimateFloat('height', OldHeight, 0.5);
  l.AnimateFloat('Opacity', 1, 0.5);
end;

элемент расширяется и исчезает. Однако я хочу иметь возможность добавлять строку в произвольное расположение в ListBox-фактически в текущем ItemIndex. Кто-нибудь знает, как это сделать?

3 ответов


чтобы обойти тот факт, что ListBox1.InsertObject и ListBox1.Items.Insert не работает, вы можете сделать следующее

procedure TForm1.AddItem(s: string);
var
  l : TListBoxItem;
  OldHeight : Single;
  I: Integer;
  index : integer;
begin
  l := TListBoxItem.Create(nil);
  l.Text := s;
  OldHeight := l.Height;
  l.Height := 0;
  l.Opacity := 0;
  l.Index := 0;
  l.Parent := ListBox1;

  Index := Max(0, ListBox1.ItemIndex);
  for I := ListBox1.Count - 1 downto Index + 1 do
  begin
    ListBox1.Exchange(ListBox1.ItemByIndex(i), ListBox1.ItemByIndex(i-1));
  end;
  ListBox1.ItemIndex := Index;
  l.AnimateFloat('height', OldHeight, 0.5);
  l.AnimateFloat('Opacity', 1, 0.5);
end;

но это немного смешно. Он (в конечном итоге) добавляет строку в позицию 0, если нет выбранного элемента, в противном случае добавляет ее перед выбранным элементом. Это решение слишком напоминает мне Сортировка. Вам нужно будет добавить математическую единицу в предложение uses для работы функции max.

это действительно похоже на ошибку в FireMonkey (проверьте Качество Центральное #102122), однако я подозреваю, что будущее обновление FireMonkey исправит это. Если кто-то видит лучший способ сделать это....

у меня тоже фильм об этом для тех, кто заинтересован, что иллюстрирует вещи более четко.


это должно работать, но ничего не делает:

l := TListBoxItem.Create(ListBox1);
ListBox1.InsertObject(Max(ListBox1.ItemIndex, 0), l);

если я называю следующее, Я получаю нарушение прав доступа:

ListBox1.Realign;

на самом деле, даже это дает мне AV:

ListBox1.Items.Insert(0, 'hello');
ListBox1.Realign;

но это добавляет, Конечно:

ListBox1.Items.Add('hello');

может быть, ошибка?


вместо

l.Parent := ListBox1;

использовать

ListBox1.InsertObject(Index, l);

где Index-позиция вставки.

(непроверенные, но из чтения источников он должен работать).