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

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

Сново Access Violation...


term1t ©   (2006-12-12 10:38:00) 

Доброго времени суток, мастера. Неделю уже тягаюсь с этой проблемой - результатов  нет. Перерыл много чего, но видать не достаточно. Ошибка возникает при попытке сохранения изменений в БД (FoxPro).  код прилагается. заранее благодарен.

procedure TF100P.zapomniClick(Sender: TObject);
var
 nom:integer;
begin
 nom:=dm1.TZayav.FieldByName('numzajav').AsInteger;
try
 dm1.TZayav.Edit;
 dm1.TZayav.FieldByName('forma').AsInteger:=100;
 dm1.TZayav2.Edit;
 dm1.TZayav2.FieldByName('forma').AsInteger:=100;
 dm1.TZayav.Post;  {Access viol....}
 dm1.TZayav2.Post;
 self.Close;
 ShoWmessage('Заявление №'+IntToStr(nom)+' сохранено успешно!');
except
  ShowMessage('Ошибка при сохранении заявления!');
end;
end;


term1t   (2006-12-13 11:29:00) [1]

ЮЮ ©   (13.12.06 11:11) [18]
Возможно. я только начинающий и этих тонкостей (а может и некоторых основ...) не знаю. Обязательно почитаю что-то по данной теме.


ЮЮ   (2006-12-13 11:11:00) [2]


> указывает на строку, которая вызывает окно редактирования
> заявления... одним словом это долго рассказывать, но кратко
> расскажу (может кому из "таких как я" и понадобится):


если окно редактирования - это форма, то скорей всего она ещё не создана.
Если ошибка позникает при запуске программы, когдапользователь ещё ничего не нажимал, то это мог запуститься  какой-то обработчик, например из DataModule


> приводило к той же ошибке. причины неизввестны... поэтому
> я вынес печать на другую форму. вроде бы тоже пока нормально
> работает.


Причина та же - порядок создания форм. Достаточно было обезопасить себя проверкой на nil указателя формы.


term1t   (2006-12-13 11:01:00) [3]

указывает на строку, которая вызывает окно редактирования заявления... одним словом это долго рассказывать, но кратко расскажу (может кому из "таких как я" и понадобится):
1. информация о заявлении у меня хранится в 2-х таблицах, которые имеют связь 1 к 1 и на датамаодуле для 1-й из них я установил мастерсоурс другую. при сохранении я делал пост для "главной", а потом для "подчиненной". Как я понял нужно сохранять наоборот (подчиненная, а потом главная). После того как поменял местами - все вроде бы устаканилось (тьфу-тьфу-тьфу :)).
2. на этой же форме была кнопка печати отчета (фастрепорт). после того как документ напечатан сохранение его приводило к той же ошибке. причины неизввестны... поэтому я вынес печать на другую форму. вроде бы тоже пока нормально работает.
ЮЮ, Еще раз большое спасибо!


ЮЮ   (2006-12-13 04:41:00) [4]

Ну так на какой строке стоим? В контексте [11].


AndreyRu   (2006-12-12 14:27:00) [5]

procedure TF100P.zapomniClick(Sender: TObject);
var
nom:integer;
begin
  if dm1.TZayav.RecordCount = 0 then
    exit; //Чаще всего все происходит изза этого
  dm1.TZayav.First; //Если заранее известно что запись одна
 nom:=dm1.TZayav.FieldByName('numzajav').AsInteger;
try
dm1.TZayav.Edit;
dm1.TZayav.FieldByName('forma').AsInteger:=100;
dm1.TZayav2.Edit;
dm1.TZayav2.FieldByName('forma').AsInteger:=100;
dm1.TZayav.Post;  {Access viol....}
dm1.TZayav2.Post;
self.Close;
ShoWmessage('Заявление №'+IntToStr(nom)+' сохранено успешно!');
except
 on e : exception do //Лучше обрабатывать все ошибки
   ShowMessage('Ошибка при сохранении заявления!');
end;
end;


term1t   (2006-12-12 13:33:00) [6]

up


term1t   (2006-12-12 12:02:00) [7]

ЮЮ, и на том большое спасибо за терпение! :)


ЮЮ   (2006-12-12 11:53:00) [8]

Сорри, я вынужден покинуть форум. Терзай Мастеров. Я здесь ещё подмастерье :)


ЮЮ   (2006-12-12 11:52:00) [9]

Если кликнуть по процедуре, то попадешь в исходник на проблемную строку. Один из объектов - битый.


term1t   (2006-12-12 11:45:00) [10]

при ошибке в окне Call Stack появляется 2 строки:
1- имя процедуры
2 - имя программы


ЮЮ   (2006-12-12 11:36:00) [11]

Тот - это  View > Debag Windows > Call Stack


Сергей М.   (2006-12-12 11:28:00) [12]


> смотрю, там st0-st7 - Empty


Это не тот стек.

Это регистровый стек FPU


term1t   (2006-12-12 11:20:00) [13]

Build сделал, Use Debug DCUs включил. Когда возникает ошибка - выскакивает окно с асемблеровским (я так пологаю) кодом. там есть возможность посмотреть стек, смотрю, там st0-st7 - Empty


ЮЮ   (2006-12-12 11:09:00) [14]

Use Debug DCUs включил? Build проекта сделал?


term1t   (2006-12-12 11:07:00) [15]

ЮЮ ©   (12.12.06 10:56) [3]
<Stack вызова даже пуст - чисто по симптомам узнаю
да, это так. почему это происходит и что я должен сделать?


term1t   (2006-12-12 10:58:00) [16]

ЮЮ ©   (12.12.06 10:46) [1]
спасибо, сейчас посмотрю.
cvg   (12.12.06 10:48) [2]
Во-во, в том то и дело что не постоянно, а время от времени... кое-какую закономерность я уже заметил, но этого не достаточно...


ЮЮ   (2006-12-12 10:56:00) [17]


> Четко определи длины всех массивов


И это помешает кому-то смело перешагнуть за его пределы при отключенном Range Checking? Да и если это не массив объектов, то не AV, а что-нибудь другое огребешь. Динамический массив в функции класса - это вообще песня. Stack вызова даже пуст - чисто по симптомам узнаю :)


cvg   (2006-12-12 10:48:00) [18]

У меня такое время от времени бывает. Четко определи длины всех массивов -- и не только в этом куске, а во всей программе.


ЮЮ   (2006-12-12 10:46:00) [19]

И снова про отладку.
См.  [27] в
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1165768050&n=18

Только тебе Pause даже не требуется. Ибо приложение уже остановится.


Наверх

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