2011-09-13 12 views
7

He estado tratando de encontrar un genérico forma de notificar a un control de IU de los cambios en una lista. Por ejemplo, cuando se agrega un objeto a una lista, quiero que se agregue automáticamente al cuadro de lista. Si se elimina un objeto de la lista, quiero que se elimine automáticamente del cuadro de lista.Listas de monitoreo usando LiveBindings

Por desgracia hay algunas inconsistencias enloquecedor entre las listas de Delphi: TList <> .Notify está bien, pero TStringList.OnChange ni siquiera se le diga lo que fue el cambio y TList incluso no tiene ninguna notificación en absoluto!

Esperaba que LiveBindings me diera una forma adecuada de controlar los cambios en la mayoría de las listas, pero hasta ahora no lo veo. Todos los ejemplos que he visto ocupan el control y configuran los enlaces entre los elementos de la lista y los elementos de control (elementos de la lista en mi ejemplo). Pero agregar/eliminar un objeto de la lista no afecta el control en absoluto.

¿Alguien sabe de un mecanismo que he echado de menos, o de manera más general, una buena forma genérica para hacer esto?

aclaración: Parece que ya no fui lo suficientemente claro. La razón por la que necesito una forma genérica es porque escribí un control de cuadrícula que se puede conectar a una variedad de fuentes, incluido algún código existente. Escribí una interfaz que la grilla acepta como fuente y luego una serie de clases de adaptadores para aceptar algunas listas y ponerlas a disposición como esa interfaz. Como también necesitaba aceptar código existente, anular TList.Notify no es una opción. Y dado que no hay ningún evento para ver los cambios, efectivamente significa que TList no tiene un mecanismo de notificación que pueda ser utilizado por un cliente, como mi clase de adaptador. TStrings tampoco tiene ninguno, pero TStringList plantea un cambio de conexión simple, lo que significa que la clase de adaptador no puede determinar realmente qué ha cambiado.

En realidad, tuve una solución muy buena que usó el TVirtualMethodInterceptor, pero que dejó de funcionar por completo en Delphi XE y no se corrigió en XE2.

+2

TList tiene notificaciones, pero debe anular el método protegido 'Notificar'. –

+0

@The_Fox Esta es la respuesta, al menos para TList. Debe escribirlo como una respuesta. –

Respuesta

3

Olvidó el mecanismo TList.Notify.

TList tiene un procedimiento protegido Notify que debe anular. Esta es la forma en que TObjectList funciona.

+1

Gracias por la respuesta, The_Fox, pero mi problema es que no controlo el código que contiene la lista. En consecuencia, no puedo anular un método virtual para hacer lo que quiero y el valor predeterminado TList.Notify no hace nada. Necesito un código externo a la lista para poder monitorear los cambios, por lo que espero que LiveBindings proporcione un mecanismo utilizable. Actualicé la descripción para reflejar con precisión mi caso de uso y por qué anular una virtual no funcionará. –

0

Respuesta tardía del bit, pero el TList genérico tiene un OnNotify que incluye el elemento agregado o eliminado.