2012-01-26 9 views
8

El siguiente código muy bien anima la adición de una nueva cadena al final de un cuadro de listaAnimación de la adición de una cadena en un cuadro de lista en 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; 

El elemento se agrande y se desvanece. Sin embargo yo quiero ser capaz de agregue la cadena en una ubicación arbitraria en el ListBox, en realidad en el ItemIndex actual. ¿Alguien sabe cómo hacer esto?

Respuesta

4

Para evitar el hecho de que ListBox1.InsertObject y ListBox1.Items.Insert no funcionan, puede hacer lo siguiente

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; 

pero es un poco ridículo. (Eventualmente) agrega la cadena en la posición 0 si no hay ningún elemento seleccionado, de lo contrario lo agrega antes del elemento seleccionado. Esta solución me recuerda demasiado al Bubble Sort. Necesitará agregar la unidad de matemáticas a su cláusula de uso para que funcione la función máxima.

Esto sí parece ser un error en FireMonkey (compruebe Quality Central #102122). Sin embargo, sospecho que una futura actualización de FireMonkey solucionará esto. Si alguien puede ver una mejor manera de hacerlo ...

También he made a movie sobre esto para aquellos que estén interesados, lo cual ilustra las cosas más claramente.

+0

Funciona bien. Mezclar la lista es bastante rápido a menos que tengas una lista muy grande. –

0

En lugar de

l.Parent := ListBox1; 

uso

ListBox1.InsertObject(Index, l); 

donde el índice es la posición de inserción.

(No comprobado, pero por leer las fuentes debería funcionar).

+1

ListBox1.InsertObject (0, l) no funciona y da una infracción de acceso, aunque si elimino el código relacionado con la animación, el listbox1.count aumenta pero nada cambia visiblemente. ListBox1.AddObject (l) funciona bien sin embargo (aunque da el mismo resultado que mi código original). – Alister

2

Esto debería funcionar, pero no hace nada:

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

si yo llamo el siguiente, me sale una violación de acceso:

ListBox1.Realign; 

De hecho, ni siquiera esto me da un AV:

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

Pero esto se suma, por supuesto:

ListBox1.Items.Add('hello'); 

¿Un error tal vez?

+0

Sí, estoy obteniendo el mismo resultado - Estoy de acuerdo - probablemente un error – Alister

+0

Como se indicó anteriormente, Listbox.items.Insert está actualmente roto. Tal vez arreglar en la actualización 4? –

Cuestiones relacionadas