Как использовать 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;
Это не приведет к закрытию формы, которую вы уже видите на дисплее, а скорее к утечке памяти.