在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));
任何想法?
答案 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,...)的听众收藏集] - > [Updater1 for(Edit1)] - > [EDIT1]
您的起始代码在我看来就像
Procedure TMainForm.Button1Click(...);
var NewForm: TMainForm;
begin
NewForm := TMainForm.Create;
NewForm.Close;
end;
这不会关闭你在显示器上看到的表格,更多的是 - 它会泄漏内存。