Форум: "Основная";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
ВнизЭто странное событие BGridEhSumListAfterRecalcAll Найти похожие ветки
← →
kyn66 © (2007-04-05 11:05) [0]Добрый день, мастера! Сталкнулся вот с таким казусом. В программе несколько гридов-Eh. В одном из них задействовано событие САБЖ. Если его не вызывать, то все нормально. Стоит вызвать грид с этим событием, а после него любой другой, вылетает ошибка "List index out of bounds(6)". Т.е. превышение SumList.Collection и останавливается вот на этой строке в модуле DBGridEh
procedure TCustomDBGridEh.SumListAfterRecalcAll(Sender: TObject);
begin
if Assigned(FOnSumListAfterRecalcAll) then
FOnSumListAfterRecalcAll(SumList);
Получается что второй грид принудительно вызывает это событие, хотя за ним таковое отсутствует. В чем дело? Глюкс компонента?
← →
ЮЮ © (2007-04-05 11:18) [1]> Стоит вызвать грид с этим событием, а после него любой другой
Что значит "вызыать грид"
> Получается что второй грид принудительно вызывает это событие
А может это первый ещё "дорабатывает". Посмотреть Sender недосуг? И стек вызовов?
> "List index out of bounds(6)". Т.е. превышение SumList.Collection
Это опять твои домыслы. Это скорей ошибка в коде твоего обработчика.
← →
kyn66 © (2007-04-05 11:37) [2]
> Что значит "вызыать грид"
В процессе работы каждый отдельный грид отображает данные своей таблицы
> А может это первый ещё "дорабатывает". Посмотреть 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:59) [3]> > Что значит "вызыать грид"
>
> В процессе работы каждый отдельный грид отображает данные
> своей таблицы
Никто не спорит. Но ты можешь каким-то образом то "вызывать" грид, то нет:
Стоит вызвать грид с этим событием, а после него любой другой
> Проверено. Все нормально.
Что нормально? Метод SumListAfterRecalcAll какого грида падает? У которого OnSumListAfterRecalcAll не назначен? Не верю.
> В отладчике выставлено для проверки:
Да уж. Отладка так отладка. В каком месте ты это смотришь "Для первого грида все нормально. Для последующих".
Это (GridEh.) касается только одного компонента - с именеи GridEh, что значит для последующих?
З.Ы. Код "зловредного" обработчика приведи, коль отладить нормально не можешь
← →
kyn66 © (2007-04-05 13:20) [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-06 03:37) [5]> Если событие для грида не назначено, чего сюда лезет?
Чтобы узнать назначено или нет :) А вот если назначено, т.е. 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-14 10:18) [6]
> ) Включаем опции проекта Uses Debug Dll"s и "Stop on Delphi
> Exception" среды. Делаем Build
Не нашел где это включается
← →
ЮЮ © (2007-04-16 04:04) [7]Project > Options > Compiler > Uses Debug Dll"s
Tools > Debug Options > Language Exceptions > Stop on Delphi Exceptions
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c