![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Это странное событие BGridEhSumListAfterRecalcAll [D7, WinXP]
kyn66 © (2007-04-05 11:05:00)Добрый день, мастера! Сталкнулся вот с таким казусом. В программе несколько гридов-Eh. В одном из них задействовано событие САБЖ. Если его не вызывать, то все нормально. Стоит вызвать грид с этим событием, а после него любой другой, вылетает ошибка "List index out of bounds(6)". Т.е. превышение SumList.Collectionи останавливается вот на этой строке в модуле DBGridEh
procedure TCustomDBGridEh.SumListAfterRecalcAll(Sender: TObject);
begin
if Assigned(FOnSumListAfterRecalcAll) then
FOnSumListAfterRecalcAll(SumList);
Получается что второй грид принудительно вызывает это событие, хотя за ним таковое отсутствует. В чем дело? Глюкс компонента?
ЮЮ (2007-04-16 04:04:00) [1]Project > Options > Compiler > Uses Debug Dll's
Tools > Debug Options > Language Exceptions > Stop on Delphi Exceptions
kyn66 (2007-04-14 10:18:00) [2]
> ) Включаем опции проекта Uses Debug Dll's и 'Stop on Delphi
> Exception' среды. Делаем Build
Не нашел где это включается
ЮЮ (2007-04-06 03:37:00) [3]> Если событие для грида не назначено, чего сюда лезет?
Чтобы узнать назначено или нет :) А вот если назначено, т.е. Assigned(FOnSumListAfterRecalcAll), то обработчик и вызовется: FOnSumListAfterRecalcAll(SumList), а если нет, то данный метод (TCustomDBGridEh.SumListAfterRecalcAll) ничего и не будет делать.
Теперь об отладке:
1) Включаем опции проекта Uses Debug Dll's и 'Stop on Delphi Exception' среды. Делаем Build
2) "Нарвашись" на Exception смотрим > Debug Windows > Call Stack, где совершенно отчетливо видно в каком методе и в какой строке возникло исключение, откуда (из какой строки другого метода) и с какими параметрами этот метод вызван. Теперь можно ставить бряки, выполнять пошагово, анализировать значения локальных переменных, короче - остальное дело техники.
>GridEh := TDBGridEh(FindComponent('Rep' + s + 'DBGridEh'))
если эта строка находится в обработчике, назначенном в качестве OnSumListAfterRecalcAll грида (или любом другом обработчике грида), то
исправь лучше на GridEh := TDBGridEh(Sender)
kyn66 (2007-04-05 13:20:00) [4]
> Что нормально? Метод SumListAfterRecalcAll какого грида
> падает? У которого OnSumListAfterRecalcAll не назначен?
> Не верю.
Я тоже в это не могу поверить, но это так. Почему-же меня и колбасит от того, чего не должно быть в приципе. Может я и говорю компонент неверно отрабатывает?
> Да уж. Отладка так отладка. В каком месте ты это смотришь
> 'Для первого грида все нормально. Для последующих'.Это (GridEh.
> ) касается только одного компонента - с именеи GridEh, что
> значит для последующих?З.Ы. Код "зловредного" обработчика
> приведи, коль отладить нормально не можешь
GridEh- образное имя, типа TDBGridEH. Получает нормальное имя -
GridEh := TDBGridEh(FindComponent('Rep' + s + 'DBGridEh'))
Код слишком большой и долго объяснятьнужно что откуда. А точку останова при отладке ставлю здесь, же писал:
procedure TCustomDBGridEh.SumListAfterRecalcAll(Sender: TObject);
begin
if Assigned(FOnSumListAfterRecalcAll) then // <---
FOnSumListAfterRecalcAll(SumList);
Если событие для грида не назначено, чего сюда лезет? Попробуй у себя смоделировать два грида с суммами в футоре с различным количеством элементов в SumCollection и попробуй сперва вызвать первый с большим кол-вом, затем второй. Естественно для первого должно присутствовать событие
OnSumListAfterRecalcAll, для второго - нет
ЮЮ (2007-04-05 11:59:00) [5]> > Что значит "вызыать грид"
>
> В процессе работы каждый отдельный грид отображает данные
> своей таблицы
Никто не спорит. Но ты можешь каким-то образом то "вызывать" грид, то нет:
Стоит вызвать грид с этим событием, а после него любой другой
> Проверено. Все нормально.
Что нормально? Метод SumListAfterRecalcAll какогогрида падает? У которого OnSumListAfterRecalcAll не назначен? Не верю.
> В отладчике выставлено для проверки:
Да уж. Отладка так отладка. В каком месте ты это смотришь 'Для первого грида все нормально. Для последующих'.
Это (GridEh.) касается только одного компонента - с именеи GridEh, что значит для последующих?
З.Ы. Код "зловредного" обработчика приведи, коль отладить нормально не можешь
kyn66 (2007-04-05 11:37:00) [6]
> Что значит "вызыать грид"
В процессе работы каждый отдельный грид отображает данные своей таблицы
> А может это первый ещё "дорабатывает". Посмотреть Sender
> недосуг? И стек вызовов?
Проверено. Все нормально.
> Это опять твои домыслы. Это скорей ошибка в коде твоего
> обработчика.
В отладчике выставлено для проверки:
GridEh.SumList.SumCollection.Items[0].SumValue
GridEh.SumList.SumCollection.Items[1].SumValue
GridEh.SumList.SumCollection.Items[2].SumValue
GridEh.SumList.SumCollection.Items[3].SumValue
GridEh.SumList.SumCollection.Items[4].SumValue
GridEh.SumList.SumCollection.Items[5].SumValue
GridEh.SumList.SumCollection.Items[6].SumValue
Для первого грида все нормально. Для последующих -
GridEh.SumList.SumCollection.Items[6].SumValueостается с некоторым значением. Хотя у него в коллекции только 6 элементов. ? - осталось от предыдущего грида.
ЮЮ (2007-04-05 11:18:00) [7]> Стоит вызвать грид с этим событием, а после него любой другой
Что значит "вызыать грид"
> Получается что второй грид принудительно вызывает это событие
А может это первый ещё "дорабатывает". Посмотреть Sender недосуг? И стек вызовов?
> "List index out of bounds(6)". Т.е. превышение SumList.Collection
Это опять твои домыслы. Это скорей ошибка в коде твоего обработчика.