1

Delphi Spring フレームワークでは、\Spring4D\Samples\SpringDemos\Demo.Patterns\Observer フォルダに TObservable.AddListener() を使用する方法の例があります。

ただし、TObservable.RemoveListener() の使用方法を示す例はありません。

ここでリスナーを追加します FEditorMonitor := TEditorMonitor.Create; FEditorMonitor.AddListener(TCurrentTimeEditUpdater.Create(Edit1));

次のコードを使用して Edit1 を Listener から削除しようとすると、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;

おそらく、あなたの混乱は、「Listeners から Edit1 を削除する」つもりだったという考えに表れています。しかしEdit1、リスナーになることは決してありませんでした。適切な動作をしていないだけです。リスナー コレクションに追加または削除できるものは、一部のT....Updaterクラスの個別のブリッジング オブジェクトです。それEdit1自体ではありません。

[(...、Updater1、...) を含むリスナー コレクション] -> [(Edit1) の Updater1] -> [Edit1]

あなたの開始コードは私には似ています

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

これは、すでにディスプレイに表示されているフォームを閉じません。さらに、メモリ リークを起こすだけです。

于 2013-05-30T10:53:52.050 に答える