2011-09-13 20 views
7

Bir listedeki değişikliklerin UI denetimini bildirmek için genel yolunu bulmaya çalışıyorum. Örneğin, bir listeye bir nesne eklendiğinde, liste kutusuna otomatik olarak eklenmesini istiyorum. Bir nesne listeden kaldırılırsa, liste kutusundan otomatik olarak kaldırılmasını istiyorum.LiveBindings'i kullanarak izleme listeleri

Ne yazık ki, Delphi'nin listeleri arasında bazı çıldırtıcı tutarsızlıklar var: TList <> .Notify gayet iyi ama TStringList.OnChange bile değişimin ne olduğunu söylemiyor ve TList herhangi bir bildirim bile vermiyor!

LiveBindings'in çoğu listelerde değişiklikleri izlemenin doğru bir yolunu bana vereceğini umuyordum, ancak şu ana kadar bunu göremiyorum. Gördüğüm tüm örnekler denetimi doldurur ve liste öğeleri ile kontrol öğeleri arasındaki bağları ayarlar (örneğimdeki liste kutusu öğeleri). Ancak listeden bir nesneyi eklemek/çıkarmak, denetimi hiç etkilemez.

Kaybettiğim bir mekanizmayı veya daha genel olarak bunu yapmak için güzel bir genel yöntem bilen var mı?

Açıklama: Daha önce yeterince açıkmış gibi görünmüyor. Genel bir yönteme ihtiyacımın nedeni, mevcut bazı kodlar da dahil olmak üzere çeşitli kaynaklara bağlanabilen bir ızgara denetimi yazmamdır. Izgarayı kaynak olarak kabul eden bir arabirim yazdım ve sonra bazı listeleri kabul etmek ve bu arabirim olarak kullanılabilir hale getirmek için bir dizi adaptör sınıfı yazdım. Varolan kodu da kabul etmem gerektiğinden, TList geçersiz kılınmış.Notify bir seçenek değil. Değişiklikleri görecek bir olay olmadığı için, TList'in adaptör sınıfım gibi bir istemci tarafından kullanılabilen bir bildirim mekanizması olmadığı anlamına gelir. TStrings'in de biri yoktur, ancak TStringList basit OnChange'ı yükseltir, bu da adaptör sınıfının neyin değiştiğini gerçekten belirleyemediği anlamına gelir.

Aslında, TVirtualMethodInterceptor'u kullanan çok güzel bir çözüm buldum, ancak Delphi XE'de çalışmayı tamamen durdurdu ve XE2'de sabit değil.

+2

TList bildirimleri var, ancak korunan 'Bildir 'yöntemini geçersiz kılmanız gerekiyor. –

+0

@ The_Fox Bu, en azından TList için bir cevaptır. Cevap olarak yazmalısın. –

cevap

3

TList.Notify mekanizmasını kaçırdınız. TList, geçersiz kılmanız gereken bir Notify numaralı prosedüre sahiptir. Bu, TObjectList'in çalışma şeklidir.

+1

Cevabınız için teşekkür ederiz, The_Fox, ama benim sorunum, listeyi içeren kodu kontrol etmem. Sonuç olarak, istediğim şeyi yapmak için bir sanal yöntemi geçersiz kılabilir ve varsayılan TList.Notify hiçbir şey yapmaz. Değişiklikleri izleyebilmek için listeye harici kod ihtiyacım var, bu yüzden LiveBindings'in kullanılabilir bir mekanizma sağlayabileceğini umuyorum. Kullanım durumunu doğru bir şekilde yansıtmak için açıklamayı güncelledim ve bir sanal öğeyi geçersiz kılmanın neden bir işe yaramayacağı. –

0

Biraz gecikmiş cevap, ancak jenerik TList eklenmiş veya kaldırılmış öğeyi içeren bir OnNotify'a sahip.