![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Принтер "портит" выполнение программы? [D2005, XP]
Abcdef123 © (2010-12-22 06:31:00)Здравствуйте, Мастера. Заранее извиняюсь, если мой вопрос послан не по теме данного форума.
Столкнулась с такой проблемой. Программа очень давняя, работала нормально, проблема возникла только у клиента сейчас, когда они купили новый принтер (HP). В одном месте программы дает ошибку Number out of range. Если проигнорировать ошибку и попробовать запустить то же самое (не перезагружая проект), то второй раз выполняется номально. Со старым принтером вообще нормально работает!!!
Вот сейчас детали:трассировка ошибки показала место, где получается "большое" число. В процедуре объявлена переменная типа Currency и ей присваивается некое значение, вычисляемое по формуле, на основе данных таблицы. Так вот, первый раз похоже значение это не вычисляется (это я так полагаю), поскольку интересное значение этой переменной получается: –922337203685477.5808 (то есть минимальное значение, которое может иметь этот тип). Знаний насчет драйвера принтера у меня недостаточно. Вот и думаю, возможно ли, что драйвер принтера каким то образом "портить" программу? И если да, то каким образом второй раз ошибки нет, присваивается нужное рассчитанное значение этой переменной. Пожалуй, на этом описание закончу, если что-то нужно подробнее сообшить - спросите. Возможно, что кто-то встречался с подобной проблемой. Может я вообще не там ищу причину? Буду рада любому дельному совету. Заранее спасибо!
brother (2010-12-23 06:54:00) [21]тогда, я "умываю руки" ...
Abcdef123 (2010-12-23 06:30:00) [22]To [25] нет еще, к сожалению. И похоже до нового года поездка к клиентам на это тестирование не состоится. :-(
А насчет проверки [19] я задала вопрос [24], потому что если вдруг после такой проверки какое то другое приложение у клиента вдруг будет глючить, то мне бошку оторвут за такие эксперименты.
brother (2010-12-23 05:55:00) [23]код из [17] или [19] опробован?
Abcdef123 (2010-12-23 05:49:00) [24]To [23] большое спасибо за ответ!!! Поскольку этого не знала, то еще небольшой вопросик - это сбрасывание в дефолтовое состояние распространяется только на процесс работы моего проекта (если я вставлю этот код), или даже после окончания работы с моей программой это дефорлтовое состояние остается? Если остается, то я боюсь, а вдруг это сбрасывание повредит работу других приложений у клиента? (опять же извиняюсь за возможно глупый вопрос)
brother (2010-12-23 05:21:00) [25]> "asm FINIT end;" Что это?
http://forum.shelek.ru/index.php/topic,8892.0.html
1. finit сбрасывает состояние FPU в дефолтовое и, как следствие, переписывает регистр управления.
Abcdef123 (2010-12-23 04:43:00) [26]To [21] мне посоветовали "инициализировать переменную перед этим не пробовали?". И я ответила, что пробовала инициализировать, но проблема всё та же.
To [20] простите, может вопрос примитивный, но я правда не знаю, что это вы предлагаете " asm FINIT end;" Что это?
Anatoly Podgoretsky (2010-12-22 13:40:00) [27]> Abcdef123 (22.12.2010 09:13:08) [8]
Не помогло, что?
turbouser (2010-12-22 12:33:00) [28]Если уж Currency - так надо везде Currency.
И FieldByName(xxx).AsCurrency и rlPercent : Currency;
han_malign (2010-12-22 11:23:00) [29]- попробуй вот это заклинание:
asm FINIT end;а потом вот здесь
rlAmount := CalcProportionAsAmount(...)
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
begin
asm FINIT end;
try
result:= rlAmount * (rlSubTotal / rlTotal);
except
result:= 0;
end;
end
- не раз и не два, встречал случаи когда что-то-где-то выводило из себя сопроцессор...
Abcdef123 (2010-12-22 10:37:00) [30]To [17]: Хорошо, попробую! Спасибо! Но, наверно, сегодня не получится проверить у клиента на месте. Так что сообщу о резульататах позже. А пока, спасибо всем! Если есть еще предложения, чтоб уж заодно все проверить - милости просим. :-)
brother (2010-12-22 10:31:00) [31]
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
begin
try
result:= rlAmount * (rlSubTotal / rlTotal); // поставить тут бряк и посмотреть какие значения...
except
result:= 0;
end;
end
Ega23 (2010-12-22 10:28:00) [32]
> То есть вы уверены, что замена типа 100% исправит ситуацию?
Я ни в чём не уверен. Даже в своей будущей половой ориентации.
Но практика показывает, что чем меньше "тёмных" мест и небезопасного кода - тем проще детектируются ошибки (а в идеале - вообще не возникают).
MonoLife (2010-12-22 10:16:00) [33]
> То есть вы уверены, что замена типа 100% исправит ситуацию?
нет.
к слову, из справки (D7):
When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000.
Abcdef123 (2010-12-22 10:02:00) [34]To [13] То есть это и создает проблему? То есть вы уверены, что замена типа 100% исправит ситуацию? Просто поскольку пробоема не у нас,а на стороне (у клиента) сами понимаете, хотелось бы уже ограничить количество выездов для эксперимента. Поэтому, если это как одна из возможных идей, может еще есть предположения в ошибке?
Хорошо, я поменяю тип rlPercent на сарренси. Но, не могли бы вы пояснить, почему так нелогично работает? То есть при первом заходе сбоит, а при втором нормально. Это ж одна и та же процедура выполняется. А со старым принтером вообще нормально. Вот это никак в логику не укладывается.
Ega23 (2010-12-22 09:54:00) [35]
> Я полагала, что эти типа совместимы в математических операциях.
Совместимы, да не совсем.
Abcdef123 (2010-12-22 09:51:00) [36]To [11]: Это вопрос или такой стиль утверждения, что тут и ошибка?Честно говоря, я не думала, что оперировать с карренси и реал может вызвать ошибку. Я полагала, что эти типа совместимы в математических операциях.
MonoLife (2010-12-22 09:42:00) [37]А ничего, что тип rlPercent = Real, а rlAmount (в функции) - Currency?
Abcdef123 (2010-12-22 09:23:00) [38]сразу оговорюсь, чтоб помидорами не забросали, прога ну очень старая, не моя. Я просто сопровождаю пакет.
Вот отрывок из кода, где сбоит:
procedure proc1;
var
rlBase, rlMulti, rlBaseDM, rlMultiDM, rlAmount : Currency;
begin
{Здесь некотовый код, определены значения переменных rlBase, rlMulti, rlBaseDM, rlMultiDM. Кстати, значение rlBaseDM, rlMultiDM порой бывают равны нулю}
rlAmount:= CalcProportionAsAmount(rlMulti, tblDetail.FieldByNamе('INV_AMT').AsFloat, rlBase) -
CalcProportionAsAmount(rlMultiDM, tblDetail.FieldByName('INV_MEMO').AsFloat, rlBaseDM);
{вот тут значение rlAmount большое (неправильное), которое на следующей строке вызывает ошибку, когда пытаемся присвоить это значение в поле таблицы.}
tblHeader. FieldByName('TOTAL').AsFloat := FieldByName('TOTAL').AsFloat - rlAmount; //на этой строке выскакивает ошибка
end;
function CalcProportionAsAmount(rlTotal, rlSubTotal, rlAmount : Currency) : Currency;
var
rlPercent : Real;
begin
try
rlPercent := (rlSubTotal / rlTotal);
except
rlPercent := 0;
end;
CalcProportionAsAmount := rlAmount * rlPercent;
end;
brother (2010-12-22 09:17:00) [39]так исходники доступны? показываем тогда...
Abcdef123 (2010-12-22 09:13:00) [40]To [7] Пробовала, присвоила значение ноль. Не помогло :-(