2014-09-19 11 views
6

मैं डेल्फी एक्सई 6 और वीसीएल शैलियों का उपयोग कर रहा हूं। मेरे पास मुख्य आवेदन और डीएलएस है। मेरे मुख्य एप्लिकेशन ने रनटाइम थीम सक्षम की हैं और मैं vcl शैली फ़ाइलों का उपयोग कर रहा हूं। मैंने अपने डीएलएल के लिए काफी समान काम किया। मैंने रनटाइम थीम सक्षम की और VCL.Themes, VCL.Styles को वीसीएल स्टाइल फ़ाइल के साथ उपयोग और संसाधन फ़ाइल के तहत जोड़ा। जब डीएलएल लोड होता है तो मैं संसाधनों से वीसीएल शैली लोड करता हूं और इसे डीएलएल गुई के लिए सेट करता हूं। मुख्य ऐप और डीएलएल रनटाइम पैकेज के साथ नहीं बनाए गए हैं।डीएलएल से वीसीएल स्टाइल आवेदन में टीएमएनयूइटम को प्रभावित कर रहा है

अब मेरे पास मुख्य एप जीयूआई है जो अपनी शैली के साथ स्टाइल है और डीएलएल गुई भी अपनी शैली के साथ स्टाइल है। ऐसा लगता है कि जब तक ...

जब मैं अपने मुख्य ऐप में बटन पर क्लिक करता हूं, तो कौन सा ईवेंट TPopupMenu खोलता है, यह मुख्य ऐप शैली के बजाय डीएलएल जीयूआई के समान शैली के साथ स्टाइल किया जाता है। अगर मैं मेनू के माध्यम से नेविगेट करता हूं तो मुझे एवी भी मिलता है और प्रोग्राम क्रैश हो जाता है। संलग्न छवि पर एक नज़र डालें।

मैं क्या गलत कर रहा हूं? वर्तमान में एकमात्र कामकाज मैं अपने स्वयं के अनुकूलित TPopupMenu को किसी अन्य नियंत्रण से प्राप्त करना होगा। enter image description here


के रूप में मुझे लगता है मैं साधारण डेमो प्रोग्राम है जो अपने आवेदन के समान है तैयार वादा किया। इसमें संसाधन में जोड़े गए स्टाइल के साथ अपनी शैली और डीएलएल के साथ होस्ट एप्लिकेशन शामिल है। इसे चलाएं और बटन पॉपअप पर क्लिक करें, फिर पॉपअप से कुछ चुनने का प्रयास करें। यह कुछ StdWindowProc या उस तरह कुछ में दुर्घटनाग्रस्त हो जाएगा। यदि आप उस मेनू से कुछ चुनने का प्रयास करते हैं तो आप विंडो सिस्टम मेनू (बाएं शीर्ष कोने) पर जाते हैं, तो आप देखेंगे कि सिस्टम मेनू डीएलएल गुई और क्रैश के रूप में भी स्टाइल किया गया है। rar फ़ाइल के लिए लिंक: dropbox.com/sh/f2jmbsmw18akpyg/AAA6SWdBmVhf6n6K-mvYLLmua?dl=0

enter image description here

आपकी मदद के लिए धन्यवाद।

+0

सबसे अधिक संभावना स्पष्टीकरण यह है कि आप अपने मॉड्यूल के बीच सीमा पार VCL ऑब्जेक्ट्स पास कर रहे हैं, जब तक आप रनटाइम पैकेज का उपयोग नहीं करते हैं। –

+1

अन्य संभावना है कि मैं सोच सकता हूं कि वीसीएल शैलियों कोड शायद संसाधन गणना को फ़्लश करता है और पूरी प्रक्रिया में संसाधनों का आकलन करता है। कोड का एक त्वरित स्कैन बताता है कि यदि 'ऑटोडिस्कवर स्टाइल स्रोत' सत्य है तो कोई समस्या हो सकती है। 'EnumModules' के लिए यह कॉल मुझे थोड़ा सा दिखता है। –

+1

यदि आप इसे डीबग नहीं कर सकते हैं तो मुझे लगता है कि आप हमें इसमें खोदने के लिए कह रहे हैं। ऐसा करने के लिए हमें उस कोड को प्रदर्शित करने की आवश्यकता हो सकती है जो इस मुद्दे को प्रदर्शित करती है। –

उत्तर

6

यह वीसीएल शैलियों और जिस तरह से वे शैली मेनू के साथ एक मौलिक समस्या है। स्टाइल एक प्रक्रिया व्यापक हुक के साथ लागू किया गया है। विशेष रूप से से Vcl.Themes इकाई में SetWindowsHookEx पर कॉल द्वारा स्थापित एक सीबीटी हुक स्थापित किया गया। वास्तव में, हुक केवल जीयूआई थ्रेड पर लागू होता है, लेकिन यह इस प्रक्रिया में व्यापक रूप से प्रक्रिया है कि प्रक्रिया में बिल्कुल एक जीयूआई धागा है।

चूंकि आपके पास आपके आवेदन में वीसीएल के कई उदाहरण हैं (डीएलएल में से एक और एप्लिकेशन में से एक), दो हुक स्थापित हैं। वह एक बहुत है। हाल ही में स्थापित हुक (डीएलएल जैसा होता है) जीतता है, और यही कारण है कि डीएलएल मेनू स्टाइल आपके निष्पादन योग्य को संक्रमित करता है। और आप एक प्रवेश उल्लंघन का सामना क्यों करते हैं। डीएलएल निष्पादन योग्य से संबंधित मेनू पर काम करने की कोशिश कर रहा है। और इसलिए, आपके सर्वोत्तम प्रयासों के बावजूद, आप मेजबान निष्पादन योग्य से वीसीएल ऑब्जेक्ट्स तक पहुंचने वाले डीएलएल कोड के साथ समाप्त हो गए हैं।

इस के आसपास काम करने और दोनों मॉड्यूल में पूरी तरह शैलियों का समर्थन करने का कोई आसान तरीका नहीं है। यहां हमारे पास डिजाइन का मौलिक परिणाम है। सिस्टम को कई वीसीएल उदाहरणों का समर्थन करने के लिए डिज़ाइन नहीं किया गया था। यदि आप एकाधिक मॉड्यूल में वीसीएल शैलियों का उपयोग करना चाहते हैं, तो डिज़ाइनर आपको रनटाइम पैकेज का उपयोग करने की अपेक्षा करते हैं।

मुझे लगता है कि आप पूरी तरह से अलग धागे से डीएलएल को संचालित करके कुछ कर्षण प्राप्त करने में सक्षम हो सकते हैं। इसमें डीएलएल को उस अलग थ्रेड से लोड करना शामिल होगा ताकि वीसीएल धागे में शुरू हो। और डीएलएल को सभी कॉल उस धागे से होना होगा। और आपको उस धागे में एक संदेश लूप चलाने की आवश्यकता होगी। यह संभव है कि आप वह काम कर सकें, लेकिन मुझे शक है। यहां तक ​​कि सभी प्रावधानों के साथ भी आपको इस तथ्य को संभालना होगा कि आपके पास दो जीयूआई थ्रेड हैं जो इनपुट कतार हैंडलिंग के साथ सभी प्रकार के मुद्दों को प्रस्तुत करते हैं।

शायद एक और दृष्टिकोण डीएलएल से हुक को अनइंस्टॉल करना होगा। जब तक आपका डीएलएल मेन्यू नहीं दिखा रहा है तब तक आप उस हुक को अनइंस्टॉल करने में सक्षम हो सकते हैं। यह डीएलएल द्वारा दिखाए गए मेनू के लिए स्टाइल अक्षम कर देगा, लेकिन शायद यह स्वीकार्य है।

आपके डीएलएल का यह संस्करण (मैंने इसे कुछ हद तक सरलीकृत करने के बाद) हुक को अनइंस्टॉल किया।

library VCLStyleDLL; 

{$R 'Style.res' 'Style.rc'} 

uses 
    VCL.Styles, 
    VCL.Themes, 
    VCL.SysStyles; // to gain access to TSysPopupStyleHook 

{$R *.res} 

begin 
    TStyleManager.TrySetStyle('Glossy', false); 
    TCustomStyleEngine.UnRegisterSysStyleHook('#32768', TSysPopupStyleHook); 
end. 

डीएलएल के इस संस्करण के साथ, मेजबान निष्पादन योग्य आपके प्रश्न में आपके वर्णन का सामना नहीं करता है।

+0

आपके स्पष्टीकरण के लिए डेविड धन्यवाद। अब से हमने अपने ऐप को त्वचा के लिए तीसरे पक्ष अल्फाकंट्रोल का इस्तेमाल किया था, लेकिन अब हमने डेल्फी वीसीएल शैलियों का उपयोग करने का फैसला किया है और मैं इसके पीछे तकनीक खोज रहा हूं। मेरी पोस्ट को संपादित/समीक्षा करने और इस विषय को और अधिक पठनीय बनाने के लिए भी धन्यवाद। मैं वास्तव में इसकी प्रशंसा करता हूँ। – Nix

+0

आपका स्वागत है। एक अच्छा प्रश्न बनाने और अपनी समस्या का समाधान करने के लिए जानकारी प्रदान करने और हमारे साथ काम करने का एक अच्छा काम करने के लिए धन्यवाद। बीटीडब्ल्यू, आपको तैयार होने पर, उस जवाब को स्वीकार करना चाहिए जिसे आप सबसे अच्छा मानते हैं। आपकी पंसद। –

+0

+1 उत्कृष्ट स्पष्टीकरण :) –

7

जैसा कि डेविड कहता है कि ऐसा इसलिए होता है क्योंकि प्रत्येक वीसीएल इंस्टेंस एक पॉपअप मेनू (# 32768) बनने पर पता लगाने के लिए एक हुक स्थापित करता है। तो एक ही समय में दो हुक उदाहरण काम कर रहे हैं।

वर्कअराउंड के रूप में आप Vcl.SysStyles इकाई में परिभाषित UnRegisterSysStyleHook फ़ंक्शन का उपयोग करके dll (या ऐप में) में popupmenu शैली हुक को अक्षम कर सकते हैं।

TCustomStyleEngine.UnRegisterSysStyleHook('#32768', TSysPopupStyleHook); 
+0

+1 इस हुक को अनधिकृत करने का आधिकारिक तरीका दिखाने के लिए –

+0

मुझे इसके बारे में पता नहीं था, लेकिन क्योंकि मैंने अभी वीसीएल शैलियों के साथ शुरुआत की है और मैं अभी तक उनसे परिचित नहीं हूं। अब से हमने तीसरे पक्ष के अल्फा नियंत्रणों का उपयोग किया लेकिन हमने डेल्फी वीसीएल शैलियों के साथ जाने का फैसला किया। धन्यवाद। – Nix

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