2012-10-16 24 views
6

मेरे पास एक आवेदन है, जो डेल्फी 2007 में बनाया गया है, जिसमें TDateTimePicker फॉर्म पर है। इस दिनांक समय पिकर में ShowCheckbox संपत्ति True पर सेट है, जो अगली तारीख या समय चेक बॉक्स प्रदर्शित करती है, जिसे स्वचालित रूप से तब भी चुना जाता है जब उपयोगकर्ता द्वारा दिनांक चुना जाता है, या जब तिथि या समय कोड द्वारा बदला जाता है। इस चेक बॉक्स की स्थिति को उपयोगकर्ता द्वारा मैन्युअल रूप से नियंत्रित किया जा सकता है और इसकी स्थिति Checked संपत्ति द्वारा निर्धारित की जा सकती है।TDateTimePicker क्यों करता है। जांच की गई विंडो हमेशा विंडोज 7 पर सच है?

निम्न कोड दिखाता है कि कैसे 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 पर अपेक्षा के अनुरूप उपरोक्त कोड काम करता है, लेकिन विंडोज 7 पर, Checked संपत्ति विवरणी हमेशा सच उस चेक बॉक्स की असली स्थिति के बावजूद।

क्यों Checked संपत्ति वापस हमेशा सही होती है, भले ही चेक बॉक्स अनचेक किया जाता है? क्या किसी भी तरह से इसे ठीक करने या काम करने का कोई तरीका है?

पीएस मेरा एप्लिकेशन विंडोज थीम

उत्तर

9

डेल्फी दिनांक समय पिकर नियंत्रण के कार्यान्वयन (डेल्फी 200 में तय किया गया है, @Remy उसकी टिप्पणी में इंगित) में known issue है। डेट टाइम पिकर की स्थिति से पूछताछ करने के लिए चेक बॉक्स का उपयोग DTM_GETSYSTEMTIME संदेश, या DateTime_GetSystemtime मैक्रो, जो आंतरिक रूप से इस संदेश को भेजता है, का उपयोग किया जाना चाहिए। यदि संदेश (या मैक्रो) GDT_VALID मान देता है, और DTS_SHOWNONE शैली का उपयोग किया जाता है (डेल्फी में ShowCheckbox संपत्ति सत्य है), यह इंगित करता है कि नियंत्रण का चेक बॉक्स चेक किया गया है और उस नियंत्रण में एक वैध दिनांक समय है।

यहाँ कैसे उल्लेख मैक्रो का उपयोग करने चेक बॉक्स स्थिति का निर्धारण करने का उदाहरण है:

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

क्या इस कामकाज के साथ कोई ओएस समस्या है, या यह XP, VISTA, और 7 के लिए भी काम करता है? – mwhobrey