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;

上記のコードはWindowsXPで期待どおりに機能しますが、Windows 7では、Checkedチェックボックスの実際の状態に関係なく、プロパティは常にTrueを返します。

Checkedチェックボックスがオフの場合でも、プロパティが常にTrueを返すのはなぜですか?どういうわけかこれを修正または回避する方法はありますか?

PS私のアプリケーションはWindowsテーマを使用しています

4

1 に答える 1

9

これは、known issueDelphiの日時ピッカーコントロールの実装です(@Remyがコメントで指摘したように、Delphi 2009で修正されました)。日時ピッカーの状態を照会するには、DTM_GETSYSTEMTIMEメッセージ、またはDateTime_GetSystemtimeこのメッセージを内部的に送信するマクロのいずれかを使用する必要があります。メッセージ(またはマクロ)がGDT_VALID値を返し、DTS_SHOWNONEスタイルが使用されている場合(DelphiShowCheckboxではプロパティが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;
于 2012-10-16T13:13:06.603 に答える