मैंने कुछ बहुत अजीब देखा है। जब मैं बंद हो रहा हूं, तो मैं फॉर्म के शीर्ष, बाएं, चौड़ाई और ऊंचाई गुणों को कायम रख रहा हूं, और इस जानकारी का उपयोग फॉर्म की आखिरी स्थिति को पुनर्स्थापित करने के लिए कर रहा हूं, जब इसे पहले से संग्रहीत जानकारी का उपयोग करके सेटबाउंड को कॉल करके एक बार फिर खोला जाता है। यह अच्छी तरह से काम करता है, लेकिन केवल तभी जब फॉर्म की स्थिति संपत्ति डिज़ाइन समय पर poDefault पर सेट हो। यदि किसी और चीज पर सेट किया गया है, जैसे poDesigned, poScreenCenter, या poMainFormCenter, SetBounds फॉर्म की पिछली स्थिति और आकार को पुनर्स्थापित नहीं करता है।TForm.SetBounds केवल तभी काम करता है जब TForm.Position डिजाइन समय पर poDefault पर सेट किया गया है
यहां अजीब हिस्सा है। इससे कोई फर्क नहीं पड़ता कि स्थिति संपत्ति डिजाइन स्थिति पर निर्धारित की जाती है। मैं इस संपत्ति का मूल्य रनटाइम पर poDefault पर बदल सकता हूं और सेटबाउंड पर कॉल अभी भी सही तरीके से काम नहीं करता है। मैं दोनों प्रपत्र की OnCreate ईवेंट हैंडलर में, और साथ ही एक ओवरराइड निर्माता से निम्नलिखित
if Self.Position <> poDefault then
Self.Position := poDefault;
की तरह कुछ की कोशिश की है (और OnCreate ईवेंट हैंडलर में निर्माता में poDefault को स्थिति की स्थापना की है, और कहा जाता है SetBounds)। सभी मामलों में, रनटाइम पर poDefault में फॉर्म की स्थिति प्रॉपर्टी को बदलना उस समस्या को ठीक नहीं करता है जिसे मैंने सेटबाउंड के साथ देखा है। मुझे मिला एकमात्र संगत पैटर्न यह है कि सेटबाउंड काम करता है क्योंकि यह केवल तभी होना चाहिए जब फॉर्म की स्थिति संपत्ति डिजाइन समय पर poDefault थी।
अन्य चीजें हैं जिनके बारे में मैंने देखा है कि सेटबाउंड कैसे काम करता है जब किसी फॉर्म की स्थिति संपत्ति डिज़ाइन समय पर poDefault पर सेट नहीं होती है। उदाहरण के लिए, एक फॉर्म जिसका खाता संपत्ति डिज़ाइन समय पर poScreenCenter पर सेट की जाती है, यदि आप सेटबाउंड को कॉल करते हैं तो स्क्रीन पर केंद्रित नहीं होना चाहिए। हालांकि, यह सेटबाउंड द्वारा परिभाषित शीर्ष-बाएं स्थान में दिखाई नहीं देता है, न ही यह सेटबाउंड को कॉल में निर्दिष्ट चौड़ाई और ऊंचाई का सम्मान करता है। हालांकि, मुझे दोहराएं, कि मैं सेटबाउंड को कॉल करने से पहले फॉर्म की स्थिति संपत्ति को poDefault पर सेट कर रहा हूं। मैंने एप्लिकेशन पर एक कॉल भी फंस लिया है। दो ऑपरेशन के बीच प्रोसेस मैसेज, लेकिन इससे समस्या ठीक नहीं होती है।
मैंने विंडोज 10 पर चल रहे डेल्फी 10.1 बर्लिन के साथ बड़े पैमाने पर इसका परीक्षण किया है। मैंने विंडोज 7 पर डेल्फी एक्सई 6 का उपयोग करके इसका परीक्षण भी किया है।
यदि आपको संदेह है, तो चार रूपों के साथ एक वीसीएल आवेदन बनाएं। जहां निर्माता TForm2, तो TForm3 और TForm4 बनाता
with TForm2.Create(nil) do
try
ShowModal;
finally
Release;
end;
: पहले फार्म पर तीन बटन रखें, और प्रत्येक बटन के लिए निम्न OnClick की तरह कुछ जोड़ सकते हैं। poScreenCenter को स्थिति सेट form3 पर
if Self.Position <> poDefault then
Self.Position := poDefault;
Self.SetBounds(500,500,500,500);
Form2 पर, poDefault को स्थिति निर्धारित करते हैं, और form4 पर स्थिति को डिफ़ॉल्ट पर सेट छोड़ देते हैं,:
रूपों 2 की OnCreate पर 4 के माध्यम से, निम्नलिखित कोड जोड़ने poDefaultPosOnly। केवल फॉर्म 2 500, 500 की चौड़ाई और 500 की ऊंचाई के साथ 500, 500 पर दिखाई देगा।
क्या किसी के पास इस परिणाम के लिए तार्किक स्पष्टीकरण है?
'प्रक्रिया CreateParams (var Params: TCreateParams) जोड़ने की कोशिश करें; ओवरराइड; 'फॉर्मेट परिभाषा के _protected_ सेक्शन और विरासत में मिला; यदि स्वयं। स्थिति <> poDefault तो स्व। स्थिति: = poDefault; '_CreateParams_ कार्यान्वयन में। – Miamy
मियामी: CreateParams को ओवरराइड करना, और poDefault को स्थिति सेट करना! बहुत अच्छा! यह जवाब नहीं है (क्योंकि मैं एक स्पष्टीकरण मांग रहा था), लेकिन यह समस्या का एक बहुत अच्छा समाधान है। और, चूंकि मेरे सभी रूपों में एक आम पूर्वज है, इसलिए मैं इस विधि को पूर्वजों में ओवरराइड कर सकता हूं और फिर ऑनक्रेट ईवेंट हैंडलर (या ओवरराइड कन्स्ट्रक्टर) में सेटबाउंड को कॉल करने के लिए स्वतंत्र हो सकता हूं। सलाह के लिये धन्यवाद। –