Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2008, 20:25   #11
Format C:
Пользователь
 
Регистрация: 11.03.2007
Сообщений: 92
По умолчанию

А не проще использовать функцию EncodeDateTime, объявленную в DateUtils?
Format C: вне форума Ответить с цитированием
Старый 09.02.2008, 20:44   #12
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если запуск был в среде дельфи, то конечно вы получите "поворот-отворот", скомпильте ехе и запустите его...
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 20:59   #13
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Если запуск был в среде дельфи, то конечно вы получите "поворот-отворот", скомпильте ехе и запустите его...
Спасибо, попробую сейчас. А почемуесли в среде делфи то все равно ошибка? Как тогда отлаживать:Копилить ехешник и запускать?
Хочется решить проблему все таки с помощью IF.
Вот когда возникает проблема:
Код:
TD(D).A=(55 0 0 0 0 32 193 116)
decodeDate(D, Y1, M1, D1);       // 2008 2 8
Вот при таком знакчении переменной TDateTime оно и выдает ошибку.
Почемуне нравится такое значение, что в немнеправильно?
dimonbest вне форума Ответить с цитированием
Старый 09.02.2008, 21:01   #14
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Format C: Посмотреть сообщение
А не проще использовать функцию EncodeDateTime, объявленную в DateUtils?
Мне сейчасвсенепросто использовать, делфи изучаю недолго, а эту штукунадо написать срочно...
dimonbest вне форума Ответить с цитированием
Старый 10.02.2008, 23:26   #15
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Уже со всем разобрался, кроме этого:
Код:
РTD(D).A=(55 0 0 0 0 32 193 116)   
decodeDate(D, Y1, M1, D1);       // 2008 2 8
Почему здесь ошибка?
Подскажите, пожалуйста...
dimonbest вне форума Ответить с цитированием
Старый 10.02.2008, 23:37   #16
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Массивы через запятые инициализируются. Причем, если не ошибаюсь, не всякие, а только статические. И Вы уверены, что массив нужен как таковой?
B_N вне форума Ответить с цитированием
Старый 11.02.2008, 08:27   #17
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

При таких значениях D как Double имеет значение ~2.5e+254, что не переводимо в дату. Нужно ограничить диапазон
например
01/01/1980 = 29221
01/01/2100 = 73051

перед тем как вызвать decodeDate проверяем

Код:
 if (D > 29221) and (D < 73051) then begin
    encodeDate(...
 end else 
    // некорректная запись
alexBlack вне форума Ответить с цитированием
Старый 12.02.2008, 10:36   #18
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Спасибо всем откликнувшимся, все заработало, добился результата!
dimonbest вне форума Ответить с цитированием
Старый 17.03.2008, 12:11   #19
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

А теперь ошибку выдало в этом месте:

Код:
if (D > 29221) and (D < 73051) then begin
Значения следующие:
TD(D).A = (0,4,0,15,0,255,255,0)
D=7.29e-304
В чем ошибка, как с ней бороться?
P.S. кроме TRY
dimonbest вне форума Ответить с цитированием
Старый 17.03.2008, 13:43   #20
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Строго говоря прямое присвоение байтам переменной Double каких-то значений не совсем корректно. Это может привести к тому, что заданное нами значение не представимо как вещественное (т.е. является NAN или INF). Приведенный пример не приводит к ошибке. Может быть она возникает при других значениях ранее. Например, значение (0.4.0.15.0.255.255.255) точно дает -NAN. В этом случае первое же сравнение (D > ...) вызовет исключение. Т.е. некоторые данные в твоем файле не только не представимы в виде даты, но и непредставимы как вещественные.

Теперь о том как бороться.
Есть две функции

function IsNan(const AValue: Double): Boolean; overload;
function IsInfinite(const AValue: Double): Boolean;

1. Можно дополнить условие

if not isNAN(D) and not isInfinite(D) and (D > ...)

2. Можно проверить значения, которые мы пихаем в D. Для этого нужно разобраться с форматом Double. В справке есть его описание. см. Double type:internal formats

3. Непонятно упорное нежелание использовать try except
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формат даты разняться в Delphi Cantana Помощь студентам 4 28.04.2008 09:16
Изменение упакованного exe Marsik Софт 5 28.01.2008 10:30
формат картинки AndrewASV Общие вопросы Delphi 3 23.09.2007 12:45
SOL-запрос интервала даты и времени в Delphi DENIS_ БД в Delphi 5 23.12.2006 12:55