2012-10-16 10 views
6

私は、フォームにTDateTimePickerのDelphi 2007で構築されたアプリケーションを持っています。この日付時刻選択ツールのプロパティはTrueに設定されています。日付または時刻の隣にチェックボックスが表示され、ユーザーが日付を選択するたびに自動的に選択されるか、コードによって日付または時刻が変更されます。このチェックボックスの状態は、ユーザーが手動で制御することもでき、その状態はCheckedプロパティで判断できます。Windows 7でTDateTimePicker.Checkedが常にTrueを返すのはなぜですか?

次のコードは、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のテーマを使用しています

答えて

9

これはDelphiの日付時刻選択コントロールの実装でknown issueです(コメントは@Remyとして指摘されているように、Delphi 2009で修正されています)。日付時刻の状態を問い合せるには、DTM_GETSYSTEMTIMEメッセージ、または内部的にこのメッセージを送信するDateTime_GetSystemtimeマクロを使用する必要があります。メッセージ(またはマクロ)がGDT_VALIDの値を返し、ShowCheckboxプロパティがTrueの場合はDTS_SHOWNONEスタイルが使用されます(ShowCheckboxプロパティがTrueの場合はDelphiで)、コントロールのチェックボックスがオンで、コントロールに有効な日付時刻が含まれていることを示します。ここで

は、チェックボックスの状態を判断するために言及したマクロを使用する方法の例です:だから

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; 
+3

ありがとうございました: – Re0sless

+1

「既知の問題」はD2009で修正されました。 –

+0

この回避策にはOSの問題はありますか?それともXP、VISTA、および7でも同じですか? – mwhobrey

関連する問題