मेरे पास एक .NET 4 विनफॉर्म एप्लिकेशन है जो डेल्फी 7 .dll से फॉर्म प्रदर्शित करता है। मेरे पास कल कुछ प्रश्न थे कि कैसे सामान्य रूप से दिखाए जाने पर डेल्फी फॉर्म को सही तरीके से व्यवहार करने के लिए प्राप्त किया जाए। इसका उत्तर दिया गया था यहां.

मैं डेल्फी .dll से एक विधि निर्यात करता हूं जो डेल्फी फॉर्म का एक उदाहरण बनाता है, उस फॉर्म में पॉइंटर को .NET पर लौटाता है। मैं डेल्फी फॉर्म दिखाने के लिए एक विधि भी निर्यात करता हूं। दिखाएँ विधि दो पैरामीटर: प्रकार पूर्णांक का स्वामी; और प्रकार सूचक का रूप।

मैं CreateForm विधि को कॉल करता हूं, जो डेल्फी फॉर्म बनाता है, डेल्फी के एप्लिकेशन ऑब्जेक्ट को फॉर्म के कन्स्ट्रक्टर को पास करता है। मैं लौटे पॉइंटर को .NET में स्टोर करता हूं। मैं फिर शो विधि को कॉल करता हूं, .NET एप्लिकेशन के मुख्य फॉर्म से हैंडल पास करता हूं और डेल्फी फॉर्म के लिए पॉइंटर।

मैं फिर उस हैंडल को डेल्फी की Application.Handle संपत्ति में असाइन करता हूं।

इससे मेरा मूल मुद्दा हल हो गया।

अब मेरे पास कुछ और मुद्दे हैं:

  • डेल्फी फॉर्म विंडोज टास्कबार पर एक बटन दिखाता है। टास्कबार बटन को दबाने के लिए अब तक मैंने जो एकमात्र तरीका पाया है, वह है डेल्फी फॉर्म को टूल विंडो के रूप में बनाना (या तो फॉर्म के BorderStyle := bsToolWindow को सेट करके या फॉर्म की शैली में WS_EX_TOOLWINDOW असाइन करके)। मुझे डेल्फी फॉर्म को सामान्य स्टाइल फॉर्म बनाने की ज़रूरत है, लेकिन मैं नहीं चाहता कि टूलबार बटन दिखाए, जैसा कि मूल डेल्फी या .NET ऐप में बच्चे के रूप कैसे व्यवहार करते हैं। और मूल निवासी से मेरा मतलब है कि जहां दी गई भाषा में पूरा आवेदन लिखा गया है।

  • जब .NET एप्लिकेशन को छोटा किया जाता है तो डेल्फी फॉर्म कम नहीं होता है। जब .NET एप्लिकेशन के मुख्य फॉर्म को छोटा किया जाता है, तो मुझे डेल्फी फॉर्म की आवश्यकता होती है, जैसे कि मूल डेल्फी या .NET ऐप में चाइल्ड फॉर्म कैसे व्यवहार करते हैं।

मुझे यकीन नहीं है, लेकिन यह स्वामित्व के मुद्दे की तरह लगता है। ऐसा लगता है कि डेल्फी फॉर्म "जानते" नहीं हैं कि वे .NET एप्लिकेशन का हिस्सा हैं।

तो मेरा मूल प्रश्न यह है: मैं डेल्फी रूपों को व्यवहार करने के लिए कैसे प्राप्त करूं जैसे कि वे आवेदन के मूल रूप थे?

आगे के विचार: मैं विंडोज 7 पर विकास कर रहा हूं, लेकिन एप्लिकेशन को एक्सपी और विस्टा पर भी ऐसा ही व्यवहार करने की जरूरत है।

2
Welton v3.61 10 मार्च 2011, 19:40

3 जवाब

सबसे बढ़िया उत्तर

अपने कोड की समीक्षा करने के बाद, मुझे एहसास हुआ कि मैंने जो मूल रूप से पोस्ट किया था वह 100% सही नहीं था। मैंने डेल्फी फॉर्म बनाते समय और डेल्फी के एप्लिकेशन को असाइन करते समय घटनाओं के अनुक्रम का अधिक सटीक विवरण देने के लिए अपना प्रश्न संपादित किया है। हैंडल।

मैंने निम्नलिखित कार्य करके इस मुद्दे को हल किया है:

मैंने शो विधि के माध्यम से इसे पारित करने के बजाय, "स्वामी" पैरामीटर को स्वीकार करने के लिए CreateForm विधि को संशोधित किया।

CreateForm विधि में अब मैं डेल्फी के एप्लिकेशन को असाइन करता हूं। पहले संपत्ति को संभालें, फिर फॉर्म बनाएं, एप्लिकेशन ऑब्जेक्ट को फॉर्म के कन्स्ट्रक्टर को पास कर दें।

अब एप्लिकेशन और चाइल्ड फॉर्म मेरे इच्छित तरीके से व्यवहार करते हैं। डेल्फी रूपों के लिए टास्कबार पर कोई बटन नहीं है, और जब .NET एप्लिकेशन का मुख्य रूप छोटा हो जाता है, तो डेल्फी फॉर्म गायब हो जाते हैं, और जब मुख्य फॉर्म बहाल हो जाता है तो फिर से प्रकट होता है।

1
Welton v3.60 10 मार्च 2011, 21:37

मुझे लगता है कि आपके बहुत सारे मुद्दे हैं जो डेल्फी रूपों के मालिक को स्थापित करके हल किए जाएंगे।

आपको इसे p/invoke के माध्यम से करना होगा:

आपको अपनी डेल्फी विंडो के विंडो हैंडल को भी जानना होगा।

साथ ही, मुझे लगता है कि आप उस बटन को हटा सकते हैं जिसे आप अन्य, अधिक जटिल पी/आह्वान विधियों द्वारा बोलते हैं। खिड़की के बाल खिड़कियों के माध्यम से लूप करने के तरीके हैं, फिर आप मूल विंडो को बटन से अलग कर सकते हैं और इसे नष्ट कर सकते हैं। यह काफी हैक है और इसे ठीक करना कठिन होगा, हालाँकि।

1
jonathanpeppers 10 मार्च 2011, 20:43
2
हुह? बिना किसी टिप्पणी के इसे डाउनवोट क्यों किया गया? क्षतिपूर्ति करने के लिए +1।
 – 
Wouter van Nifterick
10 मार्च 2011, 22:34
हाँ, कोई शक नहीं। बहुत बढ़िया है कि आपका नाम Wouter है, एक अंग्रेजी बोलने वाले के लिए, यह मुझे WOOT!!! की याद दिलाता है
 – 
jonathanpeppers
10 मार्च 2011, 22:46

आप यह कोशिश कर सकते हैं:

पब्लिक कॉन्स्टेबल इंट GWL_EXSTYLE = -20;

पब्लिक कॉन्स्टेबल इंट WS_EX_APPWINDOW = 0x00040000L;

सेटविंडोलॉन्ग (एचडब्ल्यूएनडी, जीडब्ल्यूएल_EXSTYLE, गेटविंडोलॉन्ग (एचडब्ल्यूएनडी, जीडब्ल्यूएल_EXSTYLE) | ~WS_EX_APPWINDOW);

आप http://pinvoke.net/ में SetWindowLong और GetWindowLong के लिए C# p/invoke परिभाषाएं पा सकते हैं।

उम्मीद है ये मदद करेगा।

1
yms 10 मार्च 2011, 22:56
1
मुझे आश्चर्य है कि कोई टिप्पणी छोड़े बिना यहां जवाब क्यों कम कर रहा है।
 – 
yms
10 मार्च 2011, 22:57
1
मुझे आपका बैक +1 मिला, मेरी राय में बुरा जवाब नहीं।
 – 
jonathanpeppers
11 मार्च 2011, 00:01