1

我有一个可视组件,需要检测何时删除集合项,以便重新绘制。

TCollection 具有以下受保护的过程:

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

不幸的是,它仅在添加项目时和删除之前调用。我需要知道项目何时被删除

在内部,TCollection 使用了一个 TList,它也提供了一个 Notify 过程。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 回答