1

在 Delphi Spring 框架中,\Spring4D\Samples\SpringDemos\Demo.Patterns\Observer 文件夹中有一个关于如何使用 TObservable.AddListener() 的示例。

但是没有一个例子说明如何使用 TObservable.RemoveListener()。

这里我添加了一个监听器 FEditorMonitor := TEditorMonitor.Create; FEditorMonitor.AddListener(TCurrentTimeEditUpdater.Create(Edit1));

如果我尝试使用以下代码从侦听器中删除 Edit1,则会继续通知 Edit1:

FEditorMonitor.RemoveListener(TCurrentTimeEditUpdater.Create(Edit1));

任何想法?

4

1 回答 1

2

您应该删除以前添加的侦听器,而不是创建另一个新的侦听器。

var x: TCurrentTimeEditUpdater;
x := TCurrentTimeEditUpdater.Create(Edit1);

FEditorMonitor.AddListener(x); 

...

FEditorMonitor.RemoveListener(x);
x.Free;
{ optionally } x := nil;

也许您的困惑表现在您要“从听众中删除 Edit1”的想法中。但Edit1从来没有也永远不可能成为听众。它只是没有正确的行为。您可以在 listeners 集合中添加或删除的内容是某个T....Updater类的单独桥接对象。不是Edit1自己。

[包含 (..., Updater1, ...) 的侦听器集合] -> [Updater1 for(Edit1)] -> [Edit1]

你的起始代码在我看来像

Procedure TMainForm.Button1Click(...);
var NewForm: TMainForm;
begin
    NewForm := TMainForm.Create;
    NewForm.Close;
end;

这不会关闭您已经在显示屏上看到的表单,更重要的是 - 它只会泄漏内存。

于 2013-05-30T10:53:52.050 回答