Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Это странное событие 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

Это опять твои домыслы. Это скорей ошибка в коде твоего обработчика.


Наверх

Титульная страница Поиск, карта сайта Написать письмо