2012-01-26 3 views
8

Следующий код прекрасно оживляет добавления новой строки в конце ListBoxАнимационные добавление строки в ListBox в 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. Кто-нибудь знает, как это сделать?

ответ

4

Чтобы обойти тот факт, что 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, если элемент не выбран, в противном случае он добавляется перед выбранным элементом. Это решение напоминает мне слишком много из Bubble Sort. Вам нужно будет добавить математический блок к вашему предложению для работы функции max.

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

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

+0

Он отлично работает. Перетасовка списка довольно быстро, если у вас нет очень большого списка. –

0

Вместо

l.Parent := ListBox1; 

использования

ListBox1.InsertObject(Index, l); 

, где индекс является положение вставки.

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

+1

ListBox1.InsertObject (0, l) не работает и дает нарушение прав доступа, хотя, если я удалю код, связанный с анимацией, listbox1.count увеличивается, но ничего явно не меняется. ListBox1.AddObject (l) отлично работает (хотя и дает тот же результат, что и мой исходный код). – Alister

2

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

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'); 

Возможно, ошибка?

+0

Yup, я получаю тот же результат - я согласен - вероятно, ошибка – Alister

+0

Как указано выше, Listbox.items.Insert в настоящее время поврежден. Может быть, исправить в обновлении 4? –

Смежные вопросы