2012-10-16 2 views
6

저는 양식에 TDateTimePicker과 함께 Delphi 2007로 작성된 응용 프로그램을 보유하고 있습니다. 이 날짜 시간 선택 도구는 속성이 True으로 설정되어 있습니다. 날짜 또는 시간 옆에있는 확인란은 사용자가 날짜를 선택할 때마다 자동으로 선택되거나 코드로 날짜 또는 시간이 변경 될 때 자동으로 선택됩니다. 이 확인란의 상태는 사용자가 수동으로 제어 할 수 있으며 해당 상태는 Checked 속성에 의해 결정될 수 있습니다. Checked 속성을 반환 항상 사실, 윈도우 7에서 윈도우 XP에서 예상대로 위의 코드가 작동Windows 7에서 TDateTimePicker.Checked가 항상 True로 반환되는 이유는 무엇입니까?

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

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

:하지만,

다음 코드는 OnChange 경우에이 체크 박스의 상태를 확인하는 방법을 보여줍니다 해당 확인란의 실제 상태와 상관없이

Checked 속성이 확인란을 선택하지 않은 경우에도 항상 True를 반환하는 이유는 무엇입니까? 이 문제를 수정하거나 해결할 방법이 있습니까?

P. 내 응용 프로그램은 Windows 테마를 사용합니다.

답변

9

이것은 델파이 날짜 시간 선택기 컨트롤의 구현에서 known issue입니다 (주석에서 @Remy가 지적한대로 Delphi 2009에서 수정 됨). 날짜 선택기 상태 확인란을 사용하려면 DTM_GETSYSTEMTIME 메시지 또는 내부적으로이 메시지를 보내는 DateTime_GetSystemtime 매크로 중 하나를 사용해야합니다. 메시지 (또는 매크로)가 GDT_VALID 값을 반환하고 스타일이 사용되면 (ShowCheckbox 속성이 True 일 때 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; 
: 그래서

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; 

을 잘못된 델파이 구현을 해결하기 위해이 같은 도우미 함수를 만들 수 있습니다

+3

감사합니다. 매력을 느꼈습니다. – Re0sless

+1

"알려진 문제점"이 D2009에서 수정되었습니다. –

+0

이 해결 방법에 OS 문제가 있습니까? 아니면 XP, VISTA 및 7에서도 동일하게 작동합니까? – mwhobrey

관련 문제