| 
| 
 | Вопрос # 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, несмотря на настройку пикера. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |