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

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

Ошибка при закрытии программы [D7, FireBird1.5]


ввх ©   (2004-10-20 22:22:00) 

Здравствуйте Мастера! Возможно мой вопрос необходимо рассматривать в другой конференции, но дело в том что программа написана для работы с базой данных, поэтому я решил написать сюда.

Дело вот в чем: программа компилируется нормально, но при завершении выскакивает ошибка:

.... EListError with message "List index out of bounds (7).
Причем если внести какое нибудь изменение, например заремировать любую строку, то все нормально. Закрываем проэкт, открываем снова, компилируем, и ошибка появляется опять. Возвращаем то что заремировали, компилируем - завершение нормально. Снова закрываем проэкт, открываем, компилируем - ошибка. Я уже что только не пробовал, ничего не получается. Помогите пожалуйста! Если необходимо предоставлю фрагменты исходного кода.


msguns   (2004-10-21 09:34:00) [1]

А у меня вопросы по транзакциям.
Раз имеется более одной транзакции, а БД одна (судя по коду), след-но можно предположить, что весь обмен данными с БД функционально разбит на 2 части: предположительно читающую и пишущую. А если так, то к чкму это:

        if pFIBTransaction1.Active then pFIBTransaction1.Rollback;
        if pFIBTransaction2.Active then pFIBTransaction2.Rollback;
       

Далее. Сначала завершаем (в данном случае откатываем)транзакции, а потом закрываем НД, выполнявшиеся в рамках этих транзакций ?

Ну и опять же совершенно неясно, что там делается в обработчиках событий тех же датасетов (например AfterScroll или AfterClose), которые запросто могут "ожить" при завершении транзакции. Ну и прочее.

Любопытно было бы также узнать, какие "отремленные" строки кода приводят к краху приложения.


Johnmen   (2004-10-21 09:12:00) [2]

Ещё общие замечания по коду.
1. зачем в цикле   for k:=0бегин блок ?
2. зачем в with pFIBDatabase1 doбегин блок ?
3. AbonentData.Free;надо делать явно не здесь; или выполнять проверку.


Deniz   (2004-10-21 08:22:00) [3]

Добавлю, что при закрытии транзакции
if pFIBTransaction1.Active then pFIBTransaction1.Rollback;
if pFIBTransaction2.Active then pFIBTransaction2.Rollback;

все, связанные с этими транзакциями, датасеты закрываются автоматически, и соот-но  
for k:=0 to componentCount-1 do
...

практически не нужен.
Что такое AbonentData?


ЮЮ   (2004-10-21 02:45:00) [4]

Ну это же не вся программа.  
(components[k] as TpFIBDataSet).Active:=False, наверняка, вызывает навешанные на TpFIBDataSet обработчики.
Неужели сложно с отладчиком пройти всю эту процедуру и найти место, где возникает ошибка?


ввх   (2004-10-21 00:12:00) [5]

Я не знаю какой код привести точно, возьму пожалуй запрос на закрытие программы:
procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
k:integer;
begin
if Application.MessageBox('Выйти из программы?',
     'Выход',MB_ICONQUESTION+MB_OKCANCEL)=IDOK then
     begin
      with  DMClient do
       begin
         if pFIBTransaction1.Active then pFIBTransaction1.Rollback;
         if pFIBTransaction2.Active then pFIBTransaction2.Rollback;
         for k:=0 to componentCount-1 do
              begin
                if components[k] is TpFIBDataSet then
                  (components[k] as TpFIBDataSet).Active:=False;
              end;

         with pFIBDatabase1 do
          begin
            if Connected then close;
          end;
       end;
     AbonentData.Free;
     CanClose:=True;
    end
  else CanClose:=False;
end;


DeepSky   (2004-10-21 00:10:00) [6]

В принципе, самое распространённое в прогах, работающих с БД - это ошибка с параметрами Query. Хотя наверняка

> Без кода не выяснить


DrPass   (2004-10-20 23:56:00) [7]


> Дело вот в чем: программа компилируется нормально, но при
> завершении выскакивает ошибка:

Это все-таки логическая ошибка - где-то у тебя или ресурсы неправильно освобождаются, или еще что-то. Без кода не выяснить


ввх   (2004-10-20 23:36:00) [8]

У меня Celeron 1200, 256 RAM - неужели медленная машина?

/А номера параметров (индексы по ихнему в данном случае) я бы проверил все-таки./

Параметры чего? И где их проверять?


Vemer   (2004-10-20 23:15:00) [9]

У меня похожее было при работе с D на медленной машине.
Лечилось перезапуском D.
А номера параметров (индексы по ихнему в данном случае) я бы проверил все-таки.


Наверх

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