2010-08-27 12 views
5

ठीक है, यह आसान होना चाहिए, लेकिन मैं कम से कम not so good documentation में नहीं समाधान नहीं मिल रहा है, .. एक TTaskDialog में, आप एक चेक-बॉक्स जोड़ने का विकल्प है। Flags में tfVerificationFlagChecked ध्वज के माध्यम से आप इसकी आरंभिक स्थिति को नियंत्रित कर सकते हैं। लेकिन संवाद के बाद राज्य कैसे प्राप्त करें Execute डी?डेल्फी TTaskDialog में चेकबॉक्स चेक किया गया है या नहीं, यह कैसे सत्यापित करें?

बेशक कोई OnVerificationClicked ईवेंट का उपयोग कर सकता है और प्रत्येक कॉल पर चेकबॉक्स की आरंभिक स्थिति के प्रारंभ में स्थानीय चर को टॉगल कर सकता है। लेकिन एक और अधिक प्राकृतिक समाधान की उम्मीद होगी।

+0

आधिकारिक दस्तावेज, वैसे, भयभीत है। उदाहरण के लिए इसे लें: http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL वे यह भी समझाते नहीं हैं * यह * URL क्या है। यह स्पष्ट नहीं है कि प्रत्येक कार्य संवाद से जुड़ा एक यूआरएल है। और यहां (http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute) वे समझाने के लिए भूल जाते हैं कि फ़ंक्शन का क्या (बूलियन) परिणाम है! –

+1

आपके पास स्रोत कोड है, है ना? देखें कि संवाद API फ़ंक्शन का उपयोग कहां किया जाता है। इसे TaskDialogIndirect कॉल करना चाहिए। चौथा पैरामीटर अंततः चेक बॉक्स का मान प्राप्त करेगा, तो कोड इसके साथ क्या करता है? –

+0

@ रोब केनेडी: हां, विंडोज एपीआई बहुत अच्छी तरह से प्रलेखित है, इसलिए यह (हमेशा) एक अच्छा विचार है। मैं अब देख रहा हूं ... –

उत्तर

9

हे मेरे भगवान, एम्बरकेडेरो ने गलती की है।

मेरे कुछ परीक्षणों से पता चला है कि यदि चेक-बॉक्स प्रारंभ में अनचेक किया गया है, लेकिन उपयोगकर्ता द्वारा चेक किया गया है, तो tfVerificationFlagChecked ध्वज सेट किया जाएगा। लेकिन अगर ध्वज सेट किया गया है, और उपयोगकर्ता बॉक्स को अनचेक करता है, तो tfVerificationFlagCheckedFlags सेट से हटाया नहीं जाएगा। और यह अजीब नहीं है। VCL कोड करता

Result := TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult, 
    {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK; 
FModalResult := LModalResult; 
if Result then 
begin 
    FButton := TTaskDialogButtonItem(FButtons.FindButton(FModalResult)); 
    FRadioButton := TTaskDialogRadioButtonItem(FRadioButtons.FindButton(LRadioButton)); 
    if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked); 
end; 

सूचना है कि झंडा यदि चेकबॉक्स चेक किया जाता है जब संवाद बंद है, लेकिन वहाँ झंडा दूर करने के लिए करता है, तो बॉक्स उपयोगकर्ता द्वारा चुना नहीं गया है कोई कोड है शामिल है।

बेशक, एक कोड के उत्तरार्द्ध

if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked) 
    else 
    Exclude(FFlags, tfVerificationFlagChecked) 

पढ़ लिया है की उम्मीद करेंगे मुझे लगता है मैं OnVerificationClicked मैनुअल टॉगल दृष्टिकोण के साथ जाना होगा।

+2

जब आप अपना काम-आसपास कोड करते हैं, तो क्या आप इसके बारे में गुणवत्ता केंद्र पर एक रिपोर्ट भी जोड़ देंगे (यदि आपने पहले से ऐसा नहीं किया है) अन्यथा यह निश्चित रूप से निश्चित नहीं होगा ... –

2

क्या आप पढ़ सकते हैं यह देखने के लिए कि tfVerificationFlagChecked अभी भी मौजूद है या नहीं?

+0

नहीं। कोशिश की। और दस्तावेज यह भी कहता है "अगर सेट है, सत्यापन चेक बॉक्स ** प्रारंभ में ** चेक किया गया है।" –

+0

सच है, लेकिन चूंकि हमने पहले से ही दस्तावेज स्थापित कर लिया है, यह बहुत अच्छा नहीं है, हम यह नहीं मान सकते कि "प्रारंभिक" भाग सटीक है। –

+0

रॉब केनेडी: उस पर सहमत! :) –

0

डेल्फी XE7 में (संभवतः पहले के संस्करणों, भी) इस समाधान हो गया है लगता है।

choice := tfVerificationFlagChecked in tskbox.Flags; 

पसंद, एक बूलियन वैरिएबल, चेक की गई स्थिति वापस कर सकता है।

संबंधित मुद्दे