Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Ошибка при закрытии программы   Найти похожие ветки 

 
ввх ©   (2004-10-20 22:22) [0]

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

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

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


 
Vemer ©   (2004-10-20 23:15) [1]

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


 
ввх ©   (2004-10-20 23:36) [2]

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

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

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


 
DrPass ©   (2004-10-20 23:56) [3]


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

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


 
DeepSky ©   (2004-10-21 00:10) [4]

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

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


 
ввх ©   (2004-10-21 00:12) [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;


 
ЮЮ ©   (2004-10-21 02:45) [6]

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


 
Deniz ©   (2004-10-21 08:22) [7]

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

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

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


 
Johnmen ©   (2004-10-21 09:12) [8]

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


 
msguns ©   (2004-10-21 09:34) [9]

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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
1-1099552404
Владимир
2004-11-04 10:13
2004.11.21
OLE Contener


1-1099394494
Ms.Dunkul
2004-11-02 14:21
2004.11.21
Обозначение клавиш.


6-1095319344
Vovik
2004-09-16 11:22
2004.11.21
Net News Transport Protocol


6-1094809027
Samael6
2004-09-10 13:37
2004.11.21
MS Exchange Server чтение базы данных


1-1099752664
asdqwer
2004-11-06 17:51
2004.11.21
Поиск строки по маске