我有一个可视组件,需要检测何时删除了一个集合项,以便它可以重新绘制。
TCollection具有以下受保护程序:
procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); virtual;
不幸的是,只有在添加项目时才会调用它,只有才能删除它。我需要知道项目何时被删除。
在内部,TCollection使用TList,它也提供Notify过程。 TList版 包含已删除的通知。不幸的是,TList是私人会员。
如何检测TCollection项目何时被删除?
答案 0 :(得分:4)
TCollection.Notify()
是正确的方法。只需不要立即重新绘制,而是Invalidate()
组件。当实际触发下一个重绘时,删除的项目将消失。
答案 1 :(得分: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
方法。