|
Вопрос # 5 911/ вопрос решён / |
|
Здравствуйте, эксперты! Не могу понять почему этот алгоритм не работает правильно... помогите пожалуйста:
...
var CurDate: TDate;
...
if ((CurDate >= DateTimePicker1.Date) and (CurDate <= DateTimePicker.Date)) and (Path <> '') then ...
В общем... если стоит дата в пикерах одно и тоже, то алгоритм не срабатывает на >= или на <= , но если в первом пикере выбрать дату на 1 день меньше, тогда всё нормально.
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 25 января 2012, 21:53
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, eclipse!
В принципе, можно выполнить строчку:
showmessage('DateTimePicker1.date=' + floattostr(DateTimePicker1.date) +
', CurDate=' + floattostr(CurDate) +
', DateTimePicker2.date=' + floattostr(DateTimePicker2.date));
и должно стать всё понятно.
Если не понятно.
Нет таких типов, как TDate и TTime. Они оба - псевдонимы типа TDateTime. Т.е. всегда, когда мы работаем с датой, мы на самом деле работаем и с временем.
Для корректного сравнения надо:
а) либо в CurDate и DateTimePicker'ы записывать целые числа (только даты);
б) либо перед сравнением отбрасывать дробные части дат функцией Trunc().
либо а) и б) одновременно.
if ((Trunc(CurDate) >= Trunc(DateTimePicker1.Date)) and (Trunc(CurDate) <= Trunc(DateTimePicker.Date))) and (Path <> '')
then ...
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 26 января 2012, 05:33
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 29 января 2012, 20:07; участников в обсуждении: 4.
|
eclipse (статус: Посетитель), 25 января 2012, 22:15 [#1]:
Пока остановился только на таком варианте:
if ((CurDate > DateTimePicker1.Date) or (DateToStr(CurDate) = DateToStr(DateTimePicker1.Date))) then
if ((CurDate < DateTimePicker2.Date) or (DateToStr(CurDate) = DateToStr(DateTimePicker2.Date))) then
if (Path <> '') then
Но чёт, он вроде грамоздкий...
|
|
Ерёмин А.А. (статус: *Администратор), 26 января 2012, 00:29 [#2]:
Цитата (eclipse):
CurDate >= DateTimePicker1.Date
Попробуйте заменить на что-то вроде этого:
TDate(CurDate) >= TDate(DateTimePicker1.Date)
Встречался когда-то с таким, но не помню, в чём именно там было дело.
|
|
eclipse (статус: Посетитель), 26 января 2012, 01:29 [#3]:
Не помогло... остановлюсь пока на старом.
|
|
eclipse (статус: Посетитель), 26 января 2012, 11:37 [#4]:
Егор: , у меня если не получается в слепую (ну сходу написания кода), тогда я как раз начинаю всячески извращаться с showmessage. И потом гляжу что там не так... так вот... все форматы дат совпадают, всё вроде бы нормально. Потому, что если сравнивать только либо больше либо меньше (<,> , алгоритм работает. Но почему же если стоит дата в пикерах одно и тоже, то алгоритм не срабатывает на >= или на <= .
|
|
eclipse (статус: Посетитель), 26 января 2012, 11:58 [#5]:
Точнее не хочет "видеть" знак =.
|
|
Егор (статус: 10-ый класс), 26 января 2012, 18:08 [#6]:
а) нужно усекать ВСЕ даты - из datetimepicker'ов (обоих), а также CurDate
б) а условие (Path <> '') точно работает?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
26 января 2012, 18:17: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse)
|
Мережников Андрей (статус: Абитуриент), 26 января 2012, 20:24 [#7]:
можно просто в DateTimePicker-ах обнулить значения time.
|
|
eclipse (статус: Посетитель), 26 января 2012, 22:59 [#8]:
Мережников Андрей а зачем? Я просто заранее настраиваю формат пикеров в дату или время.
|
|
Мережников Андрей (статус: Абитуриент), 29 января 2012, 20:07 [#9]:
в свое время столкнулся с подобной проблемой - если не обнулить свойство time, то содержащееся в нем значение прибавляется к значению date, несмотря на настройку пикера.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|