Почему TDateTimePicker не позволяет использовать минимальный DateTime без ShowCheckbox? - PullRequest
0 голосов
/ 13 февраля 2019

Я попытался объединить 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, если я не использую его.Однако я не понимаю, в чем причина всего этого?Я не прошел всю реализацию, поэтому я должен что-то упустить, потому что это не имеет смысла.

...