2012-10-16 10 views
6

Mam wniosek, zbudowany w Delphi 2007, z TDateTimePicker w formularzu. Ten selektor daty ma właściwość ShowCheckbox ustawioną na True, która obok daty lub czasu wyświetla pole wyboru, które jest automatycznie wybierane za każdym razem, gdy data zostanie wybrana przez użytkownika lub gdy data lub czas zostaną zmienione za pomocą kodu. Stan tego pola wyboru może być również kontrolowany ręcznie przez użytkownika, a jego stan można określić za pomocą właściwości Checked.Dlaczego funkcja TDateTimePicker.Checked zwraca zawsze wartość True w systemie Windows 7?

Poniższy kod pokazuje jak określić stan tego pola wyboru w przypadku OnChange:

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

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

Powyższy kod działa zgodnie z oczekiwaniami w systemie Windows XP, ale w Windows 7, Checked powraca własności zawsze prawdziwe niezależnie od rzeczywistego stanu tego pola wyboru.

Dlaczego właściwość Checked zwraca zawsze wartość True, nawet jeśli to pole wyboru nie jest zaznaczone? Czy istnieje sposób, aby to naprawić lub obejść?

P.S. Moja aplikacja korzysta z motywów Windows:

Odpowiedz

9

To jest implementacja kontrolera wyboru daty Delphi (ustalona w Delphi 2009, jak @Remy wskazał w swoim komentarzu). Aby zapytać o pole wyboru selektora daty, należy użyć albo wiadomości DTM_GETSYSTEMTIME, albo makra DateTime_GetSystemtime, które wewnętrznie wysyła tę wiadomość. Jeśli komunikat (lub makro) zwraca wartość GDT_VALID i używany jest styl DTS_SHOWNONE (w Delphi, gdy właściwość ShowCheckbox ma wartość True), oznacza to, że pole wyboru kontrolki jest zaznaczone, a formant zawiera prawidłową datę.

Oto przykład jak używać wspomniany makro do określenia stanu pole wyboru:

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; 

Tak, można utworzyć funkcję pomocnika takiego obejścia niewłaściwą realizację 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

Dzięki temu zadziałał urok :) – Re0sless

+1

"Znany problem" został naprawiony w D2009. –

+0

Czy są jakieś problemy z systemem tym obejściem, czy działa to samo dla XP, VISTA i 7? – mwhobrey

Powiązane problemy