如何在Delphi Spring Framework中使用TObservable <t> .RemoveListener()?</t>

时间:2013-05-30 10:45:19

标签: delphi spring4d

在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));

任何想法?

1 个答案:

答案 0 :(得分:2)

你应该删除以前添加的听众,而不是创造另一个新听众。

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

FEditorMonitor.AddListener(x); 

...

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

也许你的想法中显示出你要“从侦听器中重新编辑Edit1”的错误。但是Edit1永远不会成为一个倾听者。它只是没有正确的行为。 您可以添加到侦听器集合或从侦听器集合中删除的内容 - 是某些T....Updater类的单独桥接对象。不是Edit1本身。

[包含(...,Updater1,...)的听众收藏集] - &gt; [Updater1 for(Edit1)] - &gt; [EDIT1]

您的起始代码在我看来就像

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

这不会关闭你在显示器上看到的表格,更多的是 - 它会泄漏内存。