2017-07-31 12 views
5

में आइटम इंडेक्स संपत्ति को बदलते समय मैं डेल्फी 10.1 बर्लिन पर एफएमएक्स का उपयोग कर रहा हूं।कॉम्बोबॉक्स ऑन चेंज घटना तब होती है जब आइटम

मैं इस पढ़ा (जो व्यवहार मैं चाहता है):

https://stackoverflow.com/a/42933567/1343976

ItemIndex बदलने प्रोग्राम के रूप में OnChange घटना नहीं होती तो संभव निकाल दिया जा रहा है। यह केवल उपयोगकर्ता बातचीत के जवाब में आग लगती है।

क्या यह केवल वीसीएल के लिए सच है?

मैं इस के लिए पूछ रहा हूँ, क्योंकि दुर्भाग्य से मेरे लिए, क्या से मैं, परीक्षण कर सकते हैं कोड में ItemIndex संपत्ति को संशोधित करनेOnChange घटना से चलाता है।

यदि यह सच है, तो मैं FireMonkey में वीसीएल के समान व्यवहार कैसे प्राप्त कर सकता हूं?

+5

नहीं के बराबर करने के लिए OnChange निर्धारित करें और OnChange हैंडलर बाद में बहाल:

एक साधारण दिनचर्या करने के लिए इस इस तरह someting (के रूप में @Remy द्वारा उल्लिखित) होगा। –

+0

@LURD यह मेरी राय पर है कि आप जिस खराब दृष्टिकोण का उपयोग कर सकते हैं। क्यूं कर? ऑनचेंज को शून्य पर सेट करने से पहले आपको इसे चालू करने में सक्षम होने के लिए अपना वर्तमान मान स्टोर करना होगा, जिसका अर्थ है कि आपको अपने कोड में एक और चर लागू करने की आवश्यकता है। – SilverWarior

+0

ईवेंट को रीसेट करने के बजाय, आप एक वेरिएबल सेट कर सकते हैं जो ईवेंट को देखता है और चर सेट होने पर तत्काल बाहर निकलता है।लेकिन यह अभी भी एक चर शुरू कर रहा है। जो दुनिया का अंत नहीं है ... –

उत्तर

0

इस समस्या से निपटने का सही तरीका यह पता लगाना है कि OnChange हैंडलर कहां से बुलाया जा रहा है। यह TCustomComboBox.DoChange() विधि में किया जा रहा है।

तो, तुम क्या करने की आवश्यकता है या तो:

  1. ओवरराइड OnChange घटना विधि सक्रिय न करने के लिए डिफ़ॉल्ट DoChange() विधि।

  2. विभिन्न तर्कों का उपयोग करने के लिए ItemIndex संपत्ति सेटटर को ओवरराइड करें जो DoChange() विधि को कॉल नहीं करेगा।

इन तरीकों के दोनों अपने संशोधित ComboBox के लिए एक नया वर्ग पैदा करने के लिए आवश्यकता होती है।

+3

यदि आप 'DoChange() 'को ओवरराइड करते हैं, तो ईवेंट (उपयोगकर्ता कार्रवाई) को कब और कब (कार्रवाई क्रिया) करने का निर्णय लेने पर निर्णय लेने के लिए आपको एक नई संपत्ति या पैरामीटर पेश करना होगा। आप 'ItemIndex' सेटर को ओवरराइड नहीं कर सकते हैं क्योंकि 'TCustomComboBox.SetItemIndex()' शुरू करने के लिए' वर्चुअल 'नहीं है, आपको' FMX.ListBox.pas' को संशोधित करना होगा और इसे अपनी प्रोजेक्ट में शामिल करना होगा। –

+0

@RemyLebeau आप सही हैं। 'आइटम इंडेक्स' सेटर को ओवरराइड करना संभव नहीं होगा क्योंकि यह 'आभासी' नहीं है। मैंने उसे याद किया है। इसलिए व्युत्पन्न कक्षा में 'आइटमइंडेक्स' संपत्ति को फिर से शुरू करना आवश्यक होगा जो विभिन्न सेटर विधि का उपयोग करेगा। – SilverWarior

+0

या, बस एक नई संपत्ति जोड़ें जो ओवरड्रिन 'DoChange()' देख सकता है। कोड में 'ItemIndex' सेट करने से पहले उस प्रॉपर्टी को सेट करें, फिर उसे बाद में रीसेट करें। आपको 'आइटम इंडेक्स' को फिर से चलाने की आवश्यकता नहीं है। –

2

क्या यह केवल वीसीएल के लिए सच है?

कई चीजें एफएमएक्स में एक अलग तरीके से संभाली जाती हैं।

यदि यह सच है, तो मैं FireMonkey में वीसीएल के समान व्यवहार कैसे प्राप्त कर सकता हूं?

एक सरल समाधान का ItemIndex बदलने से पहले OnChange घटना संपत्ति नहीं के बराबर है, और बाद में घटना को बहाल। ItemIndex बदलने से पहले

procedure SetItemIndex(ix : Integer; cb: TComboBox); 
var 
    original : TNotifyEvent; 
begin 
    original := cb.OnChange; 
    cb.OnChange := nil; 
    try 
    cb.ItemIndex := ix; 
    finally 
    cb.OnChange := original; 
    end; 
end; 
+0

एक पल के लिए मुझे आशा थी कि यह एक फायरमॉन्की बग था ... क्या कोड से ईवेंट को कॉल करने से पहले बूलियन वैरिएबल सेट करना और ऑनचेंज कमांड निष्पादित करने से पहले इसका परीक्षण करना बुरा विचार है? – orsomannaro

+0

यह भी काम करेगा। –

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