W dniu 02.03.2012 11:57, Arivald pisze:
> To jest ich wina, imho. Komponenty powinny to robić w bezpieczny sposób,
> a sprawdzenie Count'a nie kosztowało by za wiele. A najprawdopodobniej
> błąd jest w TcxDBDataController.SyncMasterDetail(), które próbuje
> synchronizacja z pustym datasetem, próbuje wyciągnąć wartość
> nieistniejącego pola.
>
> Jak masz źródła, to spróbuj poprawić. Albo pokaż je na grupie, zobaczymy
> gdzie jest błąd. Będziesz mógł im wysłać poprawkę, i moze uda się
> zreplikować błąd na wbudowanym datasecie.
>
>
> A jeśli nie będą chcieli poprawić, i masz źródła, to można spróbować
> hakowania run-time, i po prostu zamienić ich implementację na inną,
> działającą. Zadziała to z funkcją publiczną lub chonioną, lub każdą inną
> jeśli jesteś w stanie znaleźć jej adres run-time (np RTTI).
Wina jest ewidentnie w DevExpress. Kontroler ma dwa bufory, jeden
odwołuje się do wewnętrznego bufora i w nim występuje błąd. Dzieje się
tak, że mając dwie TList sprawdzają, czy Index rekordu w jednej jest >=
0, a w drugiej już nie. Przy czym, w niektórych wywołaniach jeżeli lista
jest pusta tworzony jest wewnętrzny bufor - ta lista druga, a w innych
nie. Ciężko to debuggować, bo wejście do metody przy tylko jednej
kolumnie i jednym rekordzie ma miejsce np. 45 razy i prowadzi z różnych
miejsc. Już mi się po prostu nie chce. Zrobiłem protezę - czyli w
datasecie master w BeforeDelete zamykam detale, jeżeli liczba rekordów
master = 1, a otwieram w after post/cancel, o ile liczba rekordów jest >
0. Wiem, że brzydkie, ale to załatwia też drugi bug, który pojawia się
wtedy, kiedy wstawiam rekord do mastera i jeszcze nie jest zakomitowany,
a chcę wstawić rekord do detali i rozwijam widok detali - a to znowu ten
błąd.
Zamotany ten opis, ale wkurzam się, że i AnyDAC jak i DevExpress olewają
tę sytuację zwalając winę a drugich.
jh