Мониторинг списков с использованием LiveBindings - PullRequest
7 голосов
/ 13 сентября 2011

Я пытался найти универсальный способ уведомления элемента управления пользовательского интерфейса об изменениях в списке.Например, когда объект добавляется в список, я хочу, чтобы он автоматически добавлялся в список.Если объект удаляется из списка, я хочу, чтобы он автоматически удалялся из списка.

К сожалению, в списках Delphi есть некоторые сводящие с ума противоречия: TList <>. Уведомление в порядке, но TStringList.OnChange даже не сообщаетВы, что это было за изменение, а TList даже не имеет никаких уведомлений!

Я надеялся, что LiveBindings даст мне правильный способ мониторинга изменений в большинстве списков, но пока я его не вижу.Все примеры, которые я видел, заполняют элемент управления и устанавливают привязки между элементами списка и элементами управления (элементы списка в моем примере).Но добавление / удаление объекта из списка никак не влияет на элемент управления.

Кто-нибудь знает механизм, который я пропустил, или, в более общем смысле, хороший общий способ сделать это?

Уточнение: Не похоже, что я был достаточно ясен раньше.Причина, по которой мне нужен общий способ, заключается в том, что я написал элемент управления сеткой, который может подключаться к различным источникам, включая некоторый существующий код.Я написал интерфейс, который сетка принимает в качестве источника, а затем несколько классов адаптеров, чтобы принять некоторые списки и сделать их доступными в качестве этого интерфейса.Так как мне нужно было также принять существующий код, переопределение TList.Notify не вариант.И поскольку нет события, чтобы увидеть изменения, это фактически означает, что TList не имеет механизма уведомлений, который может использоваться клиентом, таким как мой класс адаптера.TStrings также не имеет его, но TStringList вызывает простое OnChange, что означает, что класс адаптера не может фактически определить, что изменилось.

У меня действительно было очень хорошее решение, которое использовало TVirtualMethodInterceptor , но это полностью перестало работать в Delphi XE и не исправлено в XE2.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Вы пропустили механизм TList.Notify.

TList имеет защищенную Notify процедуру, которую необходимо переопределить. Так работает TObjectList.

0 голосов
/ 19 октября 2011

Ответ с опозданием, но общий TList имеет OnNotify, включая добавленный или удаленный элемент.

...