Почему TDateTimePicker.Проверено возврат всегда True в Windows 7?

у меня есть приложение, построенное в Delphi 2007, с TDateTimePicker на форме. Этот выбор времени даты имеет ShowCheckbox свойство имеет значение True, который рядом с датой или временем отображает флажок, который автоматически выбирается всякий раз, когда дата выбрана пользователем, или когда дата или время изменены кодом. Состояние этого флажка также может управляться пользователем вручную, и его состояние может быть определено с помощью Checked собственность.

следующий код показывает, как определите состояние этого флажка в поле OnChange событие:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DateTimePicker1.ShowCheckbox := True;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  ShowMessage('Checked: ' + BoolToStr(DateTimePicker1.Checked, True));
end;

вышеуказанный код работает как ожидалось в Windows XP, Но в Windows 7 Checked свойство возвращает всегда true, независимо от реального состояния этого флажка.

почему Checked возврат свойства всегда True, даже если флажок снят ? Есть ли способ исправить или обойти это как-то ?

P. S. мое приложение использует темы Windows

1 ответов


это known issue в реализации Delphi date time picker control (исправлено в Delphi 2009, как указал @Remy в своем комментарии). Для запроса состояния выбора даты и времени следует использовать флажок DTM_GETSYSTEMTIME сообщение, или DateTime_GetSystemtime макрос, который внутренне отправляет это сообщение. Если сообщение (или макрос) возвращает GDT_VALID значение, а DTS_SHOWNONE используется стиль (в Delphi, когда ShowCheckbox собственность True), это указывает, что флажок элемента управления установлен и что элемент управления содержит допустимое время даты.

вот пример использования упомянутого макроса для определения состояния флажка:

uses
  CommCtrl;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  SysTime: SYSTEMTIME;
begin
  if DateTime_GetSystemTime(DateTimePicker1.Handle, @SysTime) = GDT_VALID then
    ShowMessage('Check box is checked!')
  else
    ShowMessage('Check box is not checked!');
end;

таким образом, вы можете сделать вспомогательную функцию, как это, чтобы обойти неправильную реализацию Delphi:

uses
  CommCtrl;

function IsDateTimePickerChecked(ADateTimePicker: TDateTimePicker): Boolean;
var
  SysTime: SYSTEMTIME;
begin
  Result := DateTime_GetSystemTime(ADateTimePicker.Handle, @SysTime) = GDT_VALID;
end;

procedure TMyForm.ButtonOneClick(Sender: TObject);
begin
  if IsDateTimePickerChecked(DateTimePicker1) then
    ShowMessage('Check box is checked!')
  else
    ShowMessage('Check box is not checked!');
end;