2012-10-16 18 views
6

Biçimdeki TDateTimePicker ile Delphi 2007'de yerleşik bir uygulamam var. Bu tarih zaman seçicinin ShowCheckbox özelliği True olarak ayarlanmış olup, tarih veya saatin yanında, kullanıcı tarafından bir tarih alındığında veya tarih veya saat kodla değiştirildiğinde, otomatik olarak seçilen bir onay kutusu görüntülenir. Bu onay kutusunun durumu ayrıca kullanıcı tarafından manuel olarak kontrol edilebilir ve durumu Checked özelliği tarafından belirlenebilir. Checked mülkiyet döner hep Doğru, Windows 7, Windows XP beklendiği gibi yukarıdaki kod çalışırTDateTimePicker.Checked neden her zaman Windows 7'de doğrudur?

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

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

ama:

Aşağıdaki kod OnChange olay bu onay kutusunun durumunu belirlemek için nasıl gösterir Bu onay kutusunun gerçek durumuna bakılmaksızın.

Neden onay kutusu işaretli değilse bile, Checked özelliği her zaman doğrudur? Bunu bir şekilde düzeltmek ya da çözmek için bir yol var mı?

P.S. Uygulamanız Windows Temaları'nı kullanıyor

cevap

9

Bu, Delphi'nin tarih saat seçici denetiminin uygulamasında known issue (Delphi 2009'da düzeltilmiştir, @Remy yorumunda belirtilmiştir). Bir tarih saat seçicinin durumunu sorgulamak için, bu iletiyi dahili olarak gönderen DTM_GETSYSTEMTIME iletisini veya DateTime_GetSystemtime makrosunu kullanmalısınız. İleti (veya makro) GDT_VALID değerini döndürürse ve DTS_SHOWNONE stili kullanılırsa (ShowCheckbox özelliği Doğru olduğunda Delphi'de), denetimin onay kutusunun işaretli olduğunu ve bu denetimin geçerli bir tarih saati içerdiğini gösterir. İşte

onay kutusu durumunu belirlemek için belirtilen makro nasıl kullanılacağına ilişkin örnek:

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; 
: Yani

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; 

, yanlış Delphi uygulanmasını geçici çözüm için böyle bir yardımcı işlevi yapabilir

+3

Bir çekicilikte çalıştığınız için teşekkürler :) – Re0sless

+1

"Bilinen sorun" D2009'da düzeltildi. –

+0

Bu geçici çözümle ilgili işletim sistemi sorunları var mı, yoksa XP, VISTA ve 7 için aynı mı çalışıyor? – mwhobrey

İlgili konular