1

コレクションアイテムが削除されたことを検出して再ペイントできるようにする必要があるビジュアルコンポーネントがあります。

TCollectionには、次の保護された手順があります。

procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); virtual;

残念ながら、アイテムが追加されたとき、およびアイテムが削除される直前にのみ呼び出されます。アイテムがいつ削除されたかを知る必要があります。

内部的には、TCollectionはNotifyプロシージャも提供するTListを使用します。TListバージョンには、削除済み通知が含まれています。残念ながら、TListはプライベートメンバーです。

TCollectionアイテムが削除されたことをどのように検出できますか?

4

2 に答える 2

4

TCollection.Notify()正しい方法です。すぐに再描画せず、Invalidate()代わりにコンポーネントを再描画してください。次の再描画が実際にトリガーされるまでに、削除されたアイテムはなくなります。

于 2012-12-21T20:42:58.913 に答える
3

コレクションアイテムのSetCollectionメソッドをオーバーライドします。次のように実装します。

procedure TFooCollectionItem.SetCollection(const Value: TCollection);
var
  OldCollection: TFooCollection;
begin
  OldCollection := Collection as TFooCollection;
  inherited;
  if (OldCollection <> Value) and Assigned(OldCollection) then
    OldCollection.NotifyItemReallyRemoved(Self);
end;

NotifyItemReallyRemoved架空の方法を自分で提供して実装できます。

于 2012-12-21T16:20:22.753 に答える