|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Delphi 7 Access Violation
Всем доброго дня
Столкнулась с проблемой при добавлении записей посредством IBTable. Запускаю проект, и первый раз эти строки выполняются отлично: Код:
//запись в таблицу ITER i := 1; itcount := RandomRange(1, 100); for i := 1 to itcount-1 do BEGIN DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window" DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ВОТ ЗДЕСЬ !!!!!!ACCESS VIOLATION и PRIVILEGED INSTRUCTION ... формируется в базе триггером, есть ID итерации DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета.. DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50); DM.IBTable3.POST; END; //DM.IBTable3.Refresh; НО при повторном срабатывании выдавало ошибку 'Access violation at address XXXXXXX (всегда разный). Read of address YYYYYYYY' Теперь в этом же месте ошибка 'Privileged instruction' и также при повторной работе кода. Получается, что уже команда Append не проходит.. Интересно заметить, что этот код работал уже много раз и вполне успешно, но после изменений не знаю каких таких, все стало вот так. Последний раз редактировалось Rimma Zlotnikov, 18.02.2017 в 17:28. |
#2
|
|||
|
|||
Проблема не решена. Перенесла этот код на более раннюю версию проекта и все стало работать. Что же могло повлиять, интересно
|
#3
|
|||
|
|||
По внешним признакам скорее всего где-то падает обработчик события на визуальных компонентах, привязанных к этой IBTable3. Т.е. проблема не в компоненте доступа к данным, а где-то в визуальной части.
Для решения, например, можно временно "отключать" DataSource, делать вставку, потом обратно "подключать" (там есть методы DisableControls и EnableControls). Кстати, при подключенных визуальных компонентах это еще и работы убыстрит, т.к. не будет обновлять отображение. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Rimma Zlotnikov (19.02.2017)
|
#4
|
|||
|
|||
Цитата:
Код:
Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation //запись в таблицу ITER i := 1; itcount := RandomRange(1, 100); for i := 1 to itcount-1 do BEGIN DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window" DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета.. DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50); DM.IBTable3.POST; END; DM.IBTable3.Refresh; Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access Violation НО все осталось прежним |
#5
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Rimma Zlotnikov (19.02.2017)
|
#6
|
|||
|
|||
Цитата:
Больше ничегошеньки не делается c Append. В целом есть класс, через объект которого вызывается процедура: Код:
Temp.Method(k1,k2, k3, k4, alpha, betha, X1, X2, dX, E, calcnum, CType); Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real; calcnum: Integer; CType: integer); var itcount, i : integer; BEGIN Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation //запись в таблицу ITER i := 1; itcount := RandomRange(1, 100); for i := 1 to itcount-1 do BEGIN DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window" DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета.. DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50); DM.IBTable3.POST; END; DM.IBTable3.Refresh; Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access Violation END; |
#7
|
|||
|
|||
В общем, более раннюю версию также запорола. Причем я делала вещи, совершенно не связанные с проблемным IBTable3. Пару раз в этом месте вместо "Access violation" появлялось "External exception"
|
#8
|
|||
|
|||
Приношу свои извинения за не совсем полный код. Вот вся процедура:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real; calcnum: Integer; CType: integer); var itcount, i : integer; BEGIN Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation //запись в таблицу ITER i := 1; itcount := RandomRange(1, 100); for i := 1 to itcount-1 do BEGIN DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window" DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета.. DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50); DM.IBTable3.POST; END; DM.IBTable3.Refresh; Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access Violation //дозаполнение полей в таблице CALC - step, criterion, x1optim, x2optim, foptim with DM.IBQuery2 do BEGIN Close; SQL.Clear; SQL.Add('update calc set step = :step, criterion = :criterion,'); SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim '); SQL.Add('where calcnum = :calcnum'); Params.ParamByName('calcnum').Value := CALCNUM; Params.ParamByName('step').Value := (itcount/2.0) -1; Params.ParamByName('criterion').Value := 1.8; Params.ParamByName('x1optim').Value := 21; //брать последнюю итерацию из базы.. Params.ParamByName('x2optim').Value := 21; //брать последнюю итерацию из базы.. Params.ParamByName('foptim').Value := 0.11 ; //брать последнюю итерацию из базы.. ExecSQL; END; DM.IBTable1.Refresh; END; HEPL!!!!! Неужели придется разбивать на две разные процедуры. Но это, чуется мне, бред полный |
#9
|
||||
|
||||
Можно было бы посоветовать для блока with DM.IBQuery2 do подготовить запрос предварительным разбором и оптимизацией типа
Код:
... Close; if not Prepared then Prepare; ... Код:
try ExecSQL; except on e: EDataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
|||
|
|||
Цитата:
я сделала по совету: Код:
with DM.IBQuery2 do BEGIN Close; SQL.Clear; SQL.Add('update calc set step = :step, criterion = :criterion,'); SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim '); SQL.Add('where calcnum = :calcnum'); Params.ParamByName('calcnum').Value := CALCNUM; Params.ParamByName('step').Value := (itcount/2.0) -1; Params.ParamByName('criterion').Value := 1.8; Params.ParamByName('x1optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. Params.ParamByName('x2optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. Params.ParamByName('foptim').Value := 0.11 ; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. //ExecSQL; try ** ExecSQL; //!!!!!!!!!!!!!!!!!!! illegal character in input file: ' ' ($A0) * except * **on e: EDataBaseError do* MessageDlg(e.Message, mtError, [mbOK], 0); *end; |
#11
|
|||
|
|||
ввела блок TRY ручками и ошибки не стало. Но сам блок ничего не дал:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real; calcnum: Integer; CType: integer); var itcount, i : integer; BEGIN Form1.DBGrid1.DataSource.DataSet.DisableControls; //ïîïûòêà èñïðàâèòü Access Violation //çàïèñü â òàáëèöó ITER i := 1; itcount := RandomRange(1, 100); for i := 1 to itcount-1 do BEGIN DM.IBTable3.Append; //ÁÛËÀ ÎØÈÁÊÀ "cannot focus a disabled or invisible window" DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... ôîðìèðóåòñÿ â áàçå òðèããåðîì DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //äëÿ êàêîãî ðàñ÷åòà.. DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ÔÎÐÌÈÐÓÅÒÑß ÑÅÉ×ÀÑ Â ÁÀÇÅ òðèããåðîì. íî âîçìîæíî ïðèäåòñÿ ñòàâèòü çäåñü DM.IBTable3.FieldByName('X1K').AsFloat := 1; //êîîðäèíàòà X DM.IBTable3.FieldByName('X2K').AsFloat := 1; //RandomRange(1, 50) ; //êîîðäèíàòà Y DM.IBTable3.FieldByName('FK').AsFloat := 1; //RandomRange(0, 50); //DM.IBTable3.POST; try DM.IBTable3.POST; except on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0); end; END; DM.IBTable3.Refresh; Form1.DBGrid1.DataSource.DataSet.EnableControls; //ïîïûòêà èñïðàâèòü Access Violation //äîçàïîëíåíèå ïîëåé â òàáëèöå CALC - step, criterion, x1optim, x2optim, foptim with DM.IBQuery2 do BEGIN Close; SQL.Clear; SQL.Add('update calc set step = :step, criterion = :criterion,'); SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim '); SQL.Add('where calcnum = :calcnum'); Params.ParamByName('calcnum').Value := CALCNUM; Params.ParamByName('step').Value := (itcount/2.0) -1; Params.ParamByName('criterion').Value := 1.8; Params.ParamByName('x1optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. Params.ParamByName('x2optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. Params.ParamByName('foptim').Value := 0.11 ; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû.. //ExecSQL; try ExecSQL; except on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0); end; END; DM.IBTable1.Refresh; END; |
#12
|
||||
|
||||
Цитата:
Можете показать какие и где вылазят ошибки при выполнении запроса, и я бы на время отключил блок относящийся к выполнению IBTable3.Append, будет проще Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#13
|
|||
|
|||
Цитата:
|
#14
|
|||
|
|||
Цитата:
|
#15
|
||||
|
||||
Изначально
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |