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に文字列を追加します。それ以外の場合は、選択されたアイテムの前に文字列を追加します。この解決策は、バブルソートを思い出させます。max関数を機能させるには、uses句に数学単位を追加する必要があります。
これは確かにFireMonkeyのバグのようです(Quality Central #102122を確認してください)が、将来のFireMonkeyアップデートでこれが修正されると思います。誰かがこれを行うためのより良い方法を見ることができれば....
興味のある人のために、これについての映画も作りました。これは、物事をより明確に示しています。