8

次のコードは、リストボックスの最後に新しい文字列を追加することをうまくアニメーション化します

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;

アイテムは展開およびフェードインします。ただし、リストボックス内の任意の場所(実際には現在のItemIndex)に文字列を追加できるようにしたいです。誰かがこれを行う方法を知っていますか?

4

3 に答える 3

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に文字列を追加します。それ以外の場合は、選択されたアイテムの前に文字列を追加します。この解決策は、バブルソートを思い出させます。max関数を機能させるには、uses句に数学単位を追加する必要があります。

これは確かにFireMonkeyのバグのようです(Quality Central #102122を確認してください)が、将来のFireMonkeyアップデートでこれが修正されると思います。誰かがこれを行うためのより良い方法を見ることができれば....

興味のある人のために、これについての映画も作りました。これは、物事をより明確に示しています。

于 2012-01-26T22:26:11.527 に答える
2

これは機能するはずですが、何もしません。

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

その後、次の電話をかけると、アクセス違反が発生します。

ListBox1.Realign;

実際、これでも私にAVを提供します。

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

しかし、これはもちろん1つ追加します。

ListBox1.Items.Add('hello');

おそらくバグ?

于 2012-01-26T22:03:07.417 に答える
0

それ以外の

l.Parent := ListBox1;

使用する

ListBox1.InsertObject(Index, l);

ここで、Indexは挿入位置です。

(テストされていませんが、ソースを読むことで機能するはずです)。

于 2012-01-26T21:41:28.597 に答える