Как использовать TObservable<T>.RemoveListener () в Delphi Spring Framework?

В платформе Delphi Spring есть пример использования TObservable.AddListener() в папке \Spring4D\Samples\SpringDemos\Demo.Patterns\Observer.

Но нет примера, показывающего, как использовать TObservable.RemoveListener().

Здесь я добавляю слушателя FEditorMonitor := TEditorMonitor.Create; FEditorMonitor.AddListener(TCurrentTimeEditUpdater.Create(Edit1));

если я пытаюсь использовать следующий код для удаления Edit1 из прослушивателей, Edit1 продолжает получать уведомления:

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

любая идея?

1 ответ

Решение

Вы должны УДАЛИТЬ ПРЕДЫДУЩЕГО ДОБАВЛЕННОГО слушателя, а не создавать ЕЩЕ ДРУГОЙ НОВЫЙ слушатель.

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;

Это не приведет к закрытию формы, которую вы уже видите на дисплее, а скорее к утечке памяти.

Другие вопросы по тегам