Анимация добавления строки в список в 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-позиция вставки.
(непроверенные, но из чтения источников он должен работать).