Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 911

/ вопрос решён /

Здравствуйте, эксперты! Не могу понять почему этот алгоритм не работает правильно... помогите пожалуйста:
...
var CurDate: TDate;
...
if ((CurDate >= DateTimePicker1.Date) and (CurDate <= DateTimePicker.Date)) and (Path <> '') then ...

В общем... если стоит дата в пикерах одно и тоже, то алгоритм не срабатывает на >= или на <= , но если в первом пикере выбрать дату на 1 день меньше, тогда всё нормально.

eclipse Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

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

eclipse (статус: Посетитель), 26 января 2012, 01:29 [#3]:

Не помогло... остановлюсь пока на старом.
eclipse

eclipse (статус: Посетитель), 26 января 2012, 11:37 [#4]:

Егор: , у меня если не получается в слепую (ну сходу написания кода), тогда я как раз начинаю всячески извращаться с showmessage. И потом гляжу что там не так... так вот... все форматы дат совпадают, всё вроде бы нормально. Потому, что если сравнивать только либо больше либо меньше (<,>;), алгоритм работает. Но почему же если стоит дата в пикерах одно и тоже, то алгоритм не срабатывает на >= или на <= .
eclipse

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

eclipse (статус: Посетитель), 26 января 2012, 22:59 [#8]:

Мережников Андрей а зачем? Я просто заранее настраиваю формат пикеров в дату или время.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 29 января 2012, 20:07 [#9]:

в свое время столкнулся с подобной проблемой - если не обнулить свойство time, то содержащееся в нем значение прибавляется к значению date, несмотря на настройку пикера.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:02
Выполнено за 0.03 сек.