2015-09-23 7 views
1

Я установил стандарт VCL TDateTimePicker - MaxDate property to Date - например.TDateTimePicker MaxDate - не позволяет установить управление на текущую дату

DTPicker.MaxDate := Date; 

Однако есть проблемы. Если я сейчас установил дату текущей:

DTPicker.Date := Date; 

Он не принимает его. Элемент управления просто остается на дату, установленную во время разработки. Я могу решить это, установив MaxDate равным Date + 1, а затем установив свойство Date, прекрасное и показывает сегодняшнюю дату, но тогда пользователь может выбрать дату завтрашнего дня. Я также пытался установить MaxDate на Date + 0.99999999, но это также не поможет.

Я использую Delphi 2010 и C++ Builder 2010 (если это ошибка в любом из них).

Любые идеи о том, как предотвратить выбор даты на сегодняшний день и установить контрольную дату на сегодняшнюю дату?

Изменение даты - «Не удалось установить дату и время календаря».

Update:

мне удалось заставить его работать следующим образом:

  1. открыт выпадающий в TDateTimePicker (во время выполнения) и намеренно выбрать текущую дату (нажмите на уже выбрана текущая дата)
  2. после этого выбрать любую прошлую дату
  3. кнопка клика, которая имеет код для сброса даты, а затем она работает.

Мое решение, вероятно, будет использовать проверку диапазона перед закрытием формы, как это кажется, что MaxDate бесполезно, по крайней мере, с этой версией Delphi.

+2

TDateTimePicker является дата + время создания компонента. Когда вы выбираете дату antoher во время выполнения, она просто изменяет дату. Вы не можете выбрать сегодня, так как часть времени компонента будет делать целое значение * после * MaxDate. Либо установите MaxDate на (завтра - 1 мс), либо установите начальную дату выбора, чтобы не включать временную часть. –

+1

Это звучит несколько странно, что вы не можете войти сегодня, когда MaxDate сегодня, но может войти в Tomorrow, когда MaxDate будет завтра. BTW, я просто протестировал его в D2010 на Windows 7, и все работает так, как ожидалось. Так что это очень маловероятно, ошибка в D2010. –

+0

Существует определенно проблема с D2010. Мне удалось заставить его работать. Вот как - запустить программу. Намеренно выберите сегодняшнюю дату. Затем выберите любую другую дату. Затем нажмите кнопку - и затем будет работать тот же код. – Coder12345

ответ

2

Похоже, что это временная часть Date, что вызывает проблемы. Это отлично работает на D2007, Х, X Е8 и Delphi 10 Сиэтле:

DateTimePicker1.MaxDate := Trunc(Date) + 0.99999999999; 
DateTimePicker1.Date := Date; 

испытано с использованием совершенно новый VCL формирует заявку. Опускаем TDateTimePicker и TButton на форме, а также генерировать событие для FormCreate для формы:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    DateTimePicker1.MaxDate := Trunc(Date) + 0.99999999999; 
end; 

и кнопки:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    DateTimePicker1.Date := Date; 
end; 

Запустите приложение, нажмите на выпадающий DateTimePicker, чтобы отобразить календарь и выберите любую доступную дату. DateTimePicker отображает выбранную дату. Нажмите кнопку и обновления DateTimePicker, чтобы показать сегодняшнюю дату. Сбрасывание календаря снова показывает правильные даты.

Конечно, как отметил Remy Lebeau в комментарии: в реальном приложении вы не захотите жестко закодировать временную часть. Лучшим решением было бы использовать DateUtils.EndOfDay(Date) или Trunc(Date) + EncodeTime(23, 59, 59, 999).

+0

Извините, просто попробовал в Delphi 2010, и он не работает. Он устанавливает дату в текущую, если я прокомментирую первую строку, но если я удалю комментарий, она перестанет работать - дата остается на все значение, которое было установлено ранее, и не изменяется. – Coder12345

+0

Я только что испытал на трех других версиях Delphi, и все они отлично работают. ?? Что происходит, когда вы пытаетесь создать новый проект? –

+0

Я просто добавляю TDateTimePicker в форме и TButton и добавляю код для кнопки OnClick. Запустить его. Измените дату на понедельник. Нажмите кнопку - для сброса - и он ничего не делает, остается на дату понедельника. Если я прокомментирую первую строку, она сбрасывает дату на сегодняшнюю дату. Все это похоже на ошибку в Delphi 2010, особенно если вы говорите, что она работает в 3 разных версиях. – Coder12345

2

Нет большой разницы между добавлением 1 и 0.99999, так как 1 вы увеличивали бы один день до даты, а 0.999999 - почти один день (примерно 23: 59: 59: xxx).

Попробуйте следующее (вы должны включить DateUtils в списке изез): дата начала

DTPicker.MaxDate := IncSecond(Date); 
+1

Спасибо за ваше предложение, я тоже пробовал этот, но он тоже не работает. Это похоже на ошибку Delphi 2010. – Coder12345

Смежные вопросы