![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сново 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 даже не требуется. Ибо приложение уже остановится.