2011-09-13 13 views
7

Ho cercato di trovare un generico modo per notificare un controllo dell'interfaccia utente delle modifiche in un elenco. Ad esempio, quando un oggetto viene aggiunto a un elenco, lo voglio aggiunto automaticamente alla listbox. Se un oggetto viene rimosso dalla lista, lo voglio rimosso automaticamente dalla lista.Monitoraggio elenchi utilizzando LiveBindings

Sfortunatamente ci sono alcune incoerenze esasperate tra le liste di Delphi: TList <>. Nota è buono, ma TStringList.OnChange non ti dice nemmeno quale sia la modifica e TList non ha nemmeno alcuna notifica!

Speravo che LiveBindings mi desse un modo corretto di monitorare i cambiamenti nella maggior parte degli elenchi, ma finora non lo vedo. Tutti gli esempi che ho visto riempiono il controllo e impostano i collegamenti tra le voci dell'elenco e gli elementi di controllo (voci di elenco nel mio esempio). Ma aggiungere/rimuovere un oggetto dall'elenco non ha alcun effetto sul controllo.

Qualcuno sa di un meccanismo che mi è sfuggito o, più in generale, un buon modo generico per farlo?

Chiarimento: Non sembra che prima fossi abbastanza chiaro. Il motivo per cui ho bisogno di un modo generico, è perché ho scritto un controllo di griglia che può connettersi a una varietà di fonti, incluso un codice esistente. Ho scritto un'interfaccia che la griglia accetta come sorgente e quindi un certo numero di classi dell'adattatore per accettare alcune liste e renderle disponibili come tale interfaccia. Dal momento che dovevo accettare anche il codice esistente, l'override di TList.Notify non è un'opzione. E poiché non ci sono eventi per vedere le modifiche, significa che TList non ha un meccanismo di notifica utilizzabile da un client, come la mia classe dell'adattatore. TStrings non ne ha uno neanche, ma TStringList genera un semplice OnChange, il che significa che la classe dell'adattatore non può effettivamente determinare cosa è cambiato.

In realtà avevo una soluzione molto bella che utilizzava lo TVirtualMethodInterceptor, ma che ha completamente smesso di funzionare in Delphi XE e non è stato risolto in XE2.

+2

TList ha le notifiche, ma è necessario sovrascrivere il metodo 'Notify' protetto. –

+0

@The_Fox Questa è la risposta, almeno per TList. Dovresti scriverlo come risposta. –

risposta

3

Hai perso il meccanismo TList.Notify.

TList ha una procedura protetta Notify che è necessario eseguire l'override. Questo è il modo in cui TObjectList funziona.

+1

Grazie per la risposta, The_Fox, ma il mio problema è che non controllo il codice che contiene la lista. Di conseguenza, non posso ignorare un metodo virtuale per fare ciò che voglio e il TList.Notify predefinito non fa nulla. Ho bisogno di un codice esterno all'elenco per essere in grado di monitorare i cambiamenti, motivo per cui speravo che LiveBindings potesse fornire un meccanismo utilizzabile. Ho aggiornato la descrizione per riflettere con precisione il mio caso d'uso e perché l'override di un virtual non funzionerà. –

0

Bit risposta in ritardo, ma il TList generico ha un OnNotify compreso l'elemento aggiunto o rimosso.