Форум: "Потрепаться";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизDelphi глючит... Найти похожие ветки
← →
SergP (2003-09-19 21:08) [0]Сегодня обнаружил странную вещь:
точно код не могу написать, но приблизительно основные части таковы:
...
var
Form1: TForm1;
it:integer;
implementation
...
procedure TForm1.Button1Click(Sender: TObject);
begin
i:=0;
while ..... do
begin
...
savetoarray; // некоторая процедура.
label1.caption:=inttostr(i); // Здесь возникает ошибка
inc(i);
...
end;
end;
procedure tform1.savetoarray;
begin
....
label1.caption:=inttostr(i);//здесь с переменной все в порядке
end;
Ошибка возникает не всегда, и представляет собой "is not a integer value". Т.е. что-то случается с переменной i после завершения процедуры savetoarray, хотя в конце этой процедуры с ней еще все в порядке...
полностью код привести сейчас не могу, да и это не имеет смысла, все равно никто не сможет попробоватьэто у себя, так как прога у меня работает с неким COM-объектом, который в свою очередь использует Pervasive для доступа к базам данных.
Возможно с ним и связана ошибка, которая возникает, только я не могу понять каким образом.
← →
Ketmar (2003-09-19 21:33) [1]эта ошибка может возникать или в StrToInt, или в преобразованиях Variant --> Integer. в вышеописанной ситуации -- не может.
← →
Ihor Osov'yak (2003-09-19 22:58) [2]Если ексепшен возникает в некоторой процедуре, исходный код которой недоступен (или нет отладочной инфо для этой процедуры), то после "вываливания" в дебагер курсор будет стоять на следующей за породившей ексепшен процедуре..
Так что в Вашем случае ошибку ищите в
savetoarray; // некоторая процедура.
← →
jack128 (2003-09-20 01:31) [3]ИМХОб должна была возникнуть ошибка
Undeclared identifier "i"
в строке
label1.caption:=inttostr(i);//здесь с переменной все в порядке
← →
SergP (2003-09-20 03:20) [4]Я несколько часов потратил на поиски этой ошибки. Пока ничего так и не нашел.
Несколько строчек:
label1.caption:=inttostr(i);
разбросал по разным местам чтобы точнее найти место где портится переменная.
Кстати насчет ошибки я неправильно написал (спешил). Выдается что ошибка "is not valid integer value".
пробовал разные варианты, оказалось что на сам факт возникновения ошибки не влияет ни название (идентификатор) переменной, ни место где я ее объявляю. (первоначально она объявлялась у меня в процедуре procedure TForm1.Button1Click(Sender: TObject);, естественно тогда я не мог следить за ней из процедуры savetoarray).
Вообще эта переменная мне нужна была для индикации хода выполнения в Gauge (gauge.progress:=i). Как оказалось ошибка возникает после того как цикл повториться несколько раз. Т.е. состояние gauge на момент возникновения ошибки (ну и значение в label1.caption) на момент возникновения ошибки все время одинаковые. Т.е. это происходит не в самом начале, а когда i достигает определенного значения. Но когда я закоментирую вызов процедуры savetoarray, то ошибки не возникает (программа отрабатывает нормально).
попробую завтра перекинуть тело процедуры savetoarray в место где она вызывалась. Если уже и это не поможет, то тогда не знаю.
> Ihor Osov"yak © (19.09.03 22:58) [2]
> Если ексепшен возникает в некоторой процедуре, исходный
> код которой недоступен (или нет отладочной инфо для этой
> процедуры), то после "вываливания" в дебагер курсор будет
> стоять на следующей за породившей ексепшен процедуре..
> Так что в Вашем случае ошибку ищите в
>
> savetoarray; // некоторая процедура.
Но ведь в самом конце этой процедуры стоит (для эксперимента)
label1.caption:=inttostr(i);
пробовал поставить даже несколько таких строчек, все равно отладчик показывает ошибку уже после выхода из процедуры.
← →
Ihor Osov'yak (2003-09-20 12:19) [5]> Но ведь в самом конце этой процедуры стоит (для эксперимента)
Ексепшен прерывает нормальное выполнение процедуры..
Поставь в savetoarray в нескольких местах ShowMessage, понаблюдай, все ли оно выводятся.. Если влом на OK тискать, или ошибка возникает редко - вместо ShowMessage сделай контрольный вывод в лог-файл в нескольких ключевых точках, потом поизучай этот лог.. Таким образом обнаружишь, где возникает ексепшен. Я еще раз повторяю - он у тебе не на label1.caption:=inttostr(i);, а до того..
Вывод в лог - делай закрытие файле после каждой операции.
Зы - а в savetoarray случаем Application.ProcessMessages случаем не юзаешь? При особо " Очень Умелом" очень интересные эффекты получить можно...
Зы. А в качестве вывода в лог можешь востользовать это
unit e0_log;
interface
procedure Wr(const s, nameFile:string);
procedure WrTM(const s, nameFile:string);
implementation
uses sysUtils,windows;
var
CS0:TRTLCriticalSection;
procedure Wr(const s, nameFile:string);
var f: text;
begin
if nameFile = "" then exit;
EnterCriticalSection(CS0);
try
AssignFile(f, nameFile);
if FileExists(nameFile) then Append(f) else Rewrite(f);
try
Writeln(f,s);
finally
CloseFile(f);
end;
except
end;
LeaveCriticalSection(CS0);
end;
procedure WrTm(const s, nameFile: string);
begin
Wr(DateTimeToStr(now) + " " + s, nameFile);
end;
procedure ReportCurrentThreadID;
begin
//Wr (0, " Thread ID: " + IntToHex(GetCurrentThreadId, 8));
//Wr (0, "");
end;
initialization
InitializeCriticalSection(CS0);
finalization
EnterCriticalSection(CS0);
LeaveCriticalSection(CS0);
DeleteCriticalSection(CS0);
end.
← →
Юрий Федоров (2003-09-20 12:34) [6]На мой взгля 2 варианта
1. Оптимизация компилятора (бааги давно замечены) - отключить
2. Ты где-то выбиваешь память, возможно вообще в другом модуле.
У меня было такое - AV на строке
Label1.caption:="тыры-пыры", оказалось что в другом месте
я в StrNew не выделил память под#0
← →
Ihor Osov'yak (2003-09-20 12:45) [7]2 [6] Юрий Федоров © (20.09.03 12:34)
1 - очень преувеличено. Даже очень и очень..
2 - может быть.. Но: во-первых тогда,как-правило, ошибка "блуждающая"..
И во вторых тогда почти всегла AV, как в Вашем случае. А в человека вполне конкретная ошибка при работе с вариантами.. Так что у него, вероятнее всего, не этот тип ошибки..
← →
VICTOR_ (2003-09-20 13:18) [8]1.Опиши savetoarray в разделе var, а не для формы. В этом случае все работает
var
Form1: TForm1;
i: integer;
procedure savetoarray;
2.Проблема в оптимизирующем компиляторе Delphi, которая проявляется в оптимизации цикла
while ... do
← →
Ketmar (2003-09-20 15:27) [9]>VICTOR_ (20.09.03 13:18) [8]
ну вот опять очередное дарование нашло проблему в оптимизаторе... а вот не просветите ли нас, глупых, как именно выражается эта проблема? а то я ещё с первой версии while использую, а проблемы не нашёл. может, это у меня какой-то дельфи неправильный?
← →
Ihor Osov'yak (2003-09-20 15:44) [10]в дополнение к [9] Ketmar © (20.09.03 15:27),
в смысле еще одна просьба к [8] VICTOR_ (20.09.03 13:18):
также очень интересно послушать, почему при "переделывании" метода в процедуру проблемы должны исчезнуть.. И также интересно было бы узнать, с каких это пор процедуры "описывают в разделе var"..
← →
SergP (2003-09-20 15:57) [11]
> Зы - а в savetoarray случаем Application.ProcessMessages
> случаем не юзаешь? При особо "ОченьУмелом" очень интересные
> эффекты получить можно...
Нет. Но я его юзаю в процедуре из которой вызывается savetoarray.
Так как цикл довольно длинный. Выполняется за несколько минут, потому что повторяется около 35000 раз, поэтому через каждые 200 вызываю Application.ProcessMessages; чтобы не создавать видимость что прога как-бы зависла...
← →
Ihor Osov'yak (2003-09-20 16:10) [12]2 SergP © (20.09.03 15:57)
С вызываемых проц. с savetoarray также нет? К чему это я - можно получить неявную рекурсию (это зависит от того, как у тебя программа написана, у тебя это можно наблюдать при частых кликах на буттон1 - но повторяю, это только в том случае, если с savetoarray непосредственно, или с вызываемых им процедур зовется Application.ProcessMessages)..
.. Так что наверное придется тебе вывод в лог-файл делать и изучать его.. Прием несколько муторный, но в особо трудных случаях помогает..
Зы - и вероятнее всего, что причина не в "делфи глючит". И однозначно проблема не в той строчке, что ты указываешь - см. [1] Ketmar © (19.09.03 21:33), даже учитывая [6] Юрий Федоров © (20.09.03 12:34) (на сей счет см. мой пост [7]
← →
SergP (2003-09-20 16:51) [13]Все... Ура!!!
Нашел ошибку... Оказалось что она совсем в другом месте. А именно:
regnum:=strtoint(pacc.rpgkrt.NumDoc);
в pacc.rpgkrt.NumDoc хранится регистрационній номер документа в виде widestring. И как оказалось, в базе присутствуют документы с "пустым" номером... (Это мои сотрудники так зарегистрировали несколько документов). По правилам таких документов в базе не должно быть, но их все таки есть несколько штук. Да и я считал что strtoint должна преобразовывать пустую строку в 0... Но как оказалось - ошибся.
А сама дельфи долго вводила меня в заблуждение, заставляя думать что ошибка в совсем другом месте... :(
Вобщем спасибо всем!!!
← →
SergP (2003-09-20 16:59) [14]
> Зы - и вероятнее всего, что причина не в "делфи глючит".
>
Да... Ты оказался прав.
Кстати еще один вопрос: В процессе поиска ошибки я менял настройки компилятора и дебагера. А теперь скомпилированная прога долго запускается: Сначала появляются очертания окна, а только через секунду появляется все остальное. И не могу вспомнить что я сделал. Может кто подскажет?
← →
Ketmar (2003-09-20 17:50) [15]настройки пакетов, оптимизация, проверка стека?
← →
Anatoly Podgoretsky (2003-09-20 18:30) [16]SergP © (20.09.03 16:51) [13]
А что случилось с бизнес правилами?
← →
SergP (2003-09-20 18:45) [17]
> Anatoly Podgoretsky © (20.09.03 18:30) [16]
> SergP © (20.09.03 16:51) [13]
> А что случилось с бизнес правилами?
Хм... С какими? Это про что?
← →
Anatoly Podgoretsky (2003-09-20 19:05) [18]SergP © (20.09.03 16:51) [13]
← →
Ihor Osov'yak (2003-09-20 19:58) [19]2 [18] Anatoly Podgoretsky © (20.09.03 19:05)
да бизнес-правила наверно так-же глюканули, как делфи.. Автор небось то один и тот-же..
Зы - SergP, не в обиду..
← →
Sergp (2003-10-04 18:45) [20]
> Ihor Osov"yak © (20.09.03 19:58) [19]
> 2 [18] Anatoly Podgoretsky © (20.09.03 19:05)
>
> да бизнес-правила наверно так-же глюканули, как делфи..
> Автор небось то один и тот-же..
>
> Зы - SergP, не в обиду..
Да я и не обижаюсь...
А насчет этих самых как назвал их Anatoly Podgoretsky "бизнес-правил", просто смысл при регистрации отчетности должен указываться рег. номер. И этот самый рег номер в базе хранится в текстовом поле. Вот и оказалось что в нескольких местах он пропущен, поэтому strtoint нарывалась на ошибку.(Просто я с дури решил перевести его в integer), и не предусмотрел что там могут быть такие вещи.
Если бы Дельфя показала мне правильно где происходит ошибка, я бы сразу же и исправил ее. А она меня долго вводила в заблуждение...
А насчет авторства (кстати непонятно что Вы здесь имели ввиду когда сказали что автор один и тот же) то я тут ни причем. Эту всю отчетность вносят с десяток человек сотрудников. Я просто хотел написать прогу извлекающую данные из этой базы, чтобы создавать Report"ы на основе этих данных.
← →
Anatoly Podgoretsky (2003-10-04 21:04) [21]Это и говорит от отсутствии бизнес правил, где они должны быть, в итоге нарушение целостности. Как мининум должны быть установлены два NOT NULL и UNIQUE
← →
SergP (2003-10-08 05:35) [22]
> Anatoly Podgoretsky © (04.10.03 21:04) [21]
> Это и говорит от отсутствии бизнес правил, где они должны
> быть, в итоге нарушение целостности. Как мининум должны
> быть установлены два NOT NULL и UNIQUE
Так ведь не я ту гадость писал. (Кстати "Бест-Звит" назывется. Мож кто слышал :) ). Просто я в своей проге вытягивал данные из его баз с помощью COM-объекта.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.013 c