Я попытался объединить Date
во всех TDateTimePicker
, используемых для Time
, где-то на 0 и где-то на 2 или 1.1.1900 (минимальная дата sql) в соответствии с использованием.(Я знаю, что это бесполезно, это просто беспокоит меня, многие программисты определенно знают это чувство.) Я обнаружил, что тогда я не могу установить Time
на полночь, и эта ошибка продолжает появляться.
Вы должны быть в режиме ShowCheckbox, чтобы установить эту дату.
Это из-за условий в SetTime
и SetDate
, где вызывается CheckEmptyDate
.Вот выдержка из документации.
CheckEmptyDate вызывается автоматически, когда DateTime присваивается значение, которое представляет время, а не значение даты (или Date присваивается значение 0).
Что не соответствует действительности.CheckEmptyDate
вызывается в SetDate
и SetEndDate
, а не в SetDateTime
и работает только для SetEndTime
, в SetDate
вызывается, если Time
пусто.
TDateTimePicker переопределяет CheckEmptyDate, чтобы снять флажок, связанный с календарем, или вызвать EDateTimeError, если свойство ShowCheckbox имеет значение false. Это позволяет TDateTimePicker представлять значения времени, которые не включают часть даты .
Как именно это должно работать?Я попытался создать новый компонент, полученный из TDateTimePicker
, и изменил видимость DateTime
на public
, установил его на 0.0
и все работает.Хотя CheckEmptyDate
является виртуальным, я не могу просто перезаписать его, потому что он не вызывается в SetTime
, который является частным.
procedure TDateTimePicker.SetTime(Value: TTime);
var
LDateTime: TDateTime;
begin
if Abs(Frac(FDateTime)) <> Abs(Frac(Value)) then
begin
LDateTime := Value;
ReplaceDate(LDateTime, FDateTime);
if LDateTime = 0.0 then
begin
if not FShowCheckbox then
raise EDateTimeError.CreateRes({$IFNDEF CLR}@{$ENDIF}SNeedAllowNone);
FChecked := False;
Invalidate;
end
else
SetDateTime(LDateTime);
end;
end;
Я знаю, что могу установить Date
или Time
на значение, отличное от 0, если я не использую его.Однако я не понимаю, в чем причина всего этого?Я не прошел всю реализацию, поэтому я должен что-то упустить, потому что это не имеет смысла.