Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.012 c
3-89139
Гость
2003-10-06 13:48
2003.10.27
Ошибка.


3-89105
Данила
2003-10-08 12:59
2003.10.27
Результаты в DBgrid.


1-89271
RoLeX
2003-10-14 14:58
2003.10.27
Как сдлеать, чтобы программа сворачивалась в трей???


1-89382
ss300
2003-10-15 17:42
2003.10.27
обнуление переменной при изменений даты


1-89385
Checist [root]
2003-10-15 13:54
2003.10.27
Загрузка изображений в Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский