2009-05-25 12 views
7

डेल्फी 2006 (मुझे लगता है) से पहले TFlowPanel और TGridPanel पेश किया गया, मैंने एक ऐसा नियंत्रण किया जो अवधारणा में समान था। यह अभी भी कुछ चीजें करता है जो नियंत्रण नहीं करते हैं, और जब मेरे कोड को डेल्फी 200 9 में अपग्रेड करते हैं, तो मैंने इसमें कुछ सुधार जोड़ने का भी फैसला किया।डेल्फी में डिज़ाइन-टाइम ड्रैग और ड्रॉप?

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

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

कोई विचार?

अद्यतन: ठीक है, इसे काम कर रहा है। नियंत्रण के प्लेसमेंट को प्रबंधित करने के लिए कंटेनर नियंत्रण पहले से ही AlignControls को ओवरराइड कर रहा था। जब आप नेस्टेड नियंत्रण खींचते हैं और इसे छोड़ देते हैं, तो AlignControls को फिर से बुलाया जाता है। इसके बाद मैंने सूची में अन्य नियंत्रणों के साथ नियंत्रण के नए निर्देशांक की तुलना की और इसे उचित स्थिति में स्थानांतरित कर दिया।

कुछ ऐसी समस्याएं थीं जिनके लिए मुझे काम करना पड़ा (ज्यादातर एलीग्नंट्रोल पर कई कॉल से संबंधित) लेकिन बुनियादी अवधारणा काफी सरल है। सभी मदद के लिए सभी टिप्पणीकारों के लिए धन्यवाद।

+0

"बाल नियंत्रण का क्रम उनके निर्माण आदेश द्वारा निर्धारित किया जाता है" आदेश क्या है? टैब ऑर्डर? क्या आप उन्हें पैनल में शीर्ष से नीचे तक क्रमबद्ध करने के लिए टैब बनाना चाहते हैं? – Serguzest

+0

अभी, यदि आप पैनल का चयन करते हैं और उसके बाद नियंत्रण जोड़ते हैं तो नियंत्रण आपके द्वारा जोड़े गए क्रम में रखे जाएंगे। पुन: व्यवस्थित करने के लिए, आप फॉर्म को टेक्स्ट के रूप में काट और पेस्ट या देखेंगे और उन्हें चारों ओर स्थानांतरित करेंगे। मैंने अब एक नियंत्रण इंडेक्स प्रॉपर्टी को ला टीएफएलओपेनल जोड़ा है, लेकिन नियंत्रण के उपयोगकर्ताओं को सिर्फ पुन: व्यवस्थित करने के लिए ड्रैग और ड्रॉप करने में सक्षम होना चाहिए। तो संपादन 2 को पकड़ें और इसे संपादन 1 के बाईं ओर छोड़ दें और वे पैनल पर जादुई रूप से पदों को स्वैप करें। –

उत्तर

5

आप पहले से ही फ़ॉर्म पर मौजूद नियंत्रण को खींच नहीं सकते हैं और इसे अपने पैनल पर छोड़ सकते हैं। ड्रैगिंग केवल पर नियंत्रण के लिए है, न कि अपने माता-पिता को बदलने के लिए। अभिभावक को बदलने के लिए, काटें और पेस्ट करें।

यदि नियंत्रण पहले से ही आपके पैनल पर है, और आप इसे अपने पैनल पर दूसरी स्थिति में ले जाना चाहते हैं, तो पैनल TWinControl.AlignControls विधि को ओवरराइड करके लेआउट को नियंत्रित कर सकता है। जब कोई नियंत्रण स्थानांतरित हो जाता है, तो इसकी SetBounds विधि कहा जाता है, और चीजों के बीच ऐसा होता है कि यह AlignControl(Self) को अपनी मूल विंडो पर कॉल करता है। वह AlignControls पर कॉल करता है। Controls.pas पर देखें, और आप देखेंगे कि यह एक जटिल विधि है, लेकिन यह नियंत्रण पर बच्चों के लेआउट के लिए ज़िम्मेदार है, और यह वही है जो आप बदलने की योजना बना रहे हैं।

+0

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

0

क्या आपने अपने ग्रिड घटक के लिए "ऑनड्रैडड्रॉप" ईवेंट लिखने का प्रयास किया है, जहां आप जांचते हैं कि आपका घटक डिज़ाइन मोड में है या नहीं?

मैंने अभी तक ऐसा कोई घटक नहीं लिखा है, लेकिन मुझे नहीं पता कि ईवेंट ट्रिगर क्यों नहीं होना चाहिए।

+0

हाय लीजीईसी। मैंने अभी तक ऑनड्रैडड्रॉप को आजमाया नहीं है, लेकिन ऐसा लगता है कि अन्य सभी माउस ईवेंट फॉर्म डिज़ाइनर द्वारा अवरुद्ध किए गए हैं, इसलिए आपको कभी भी अधिसूचना नहीं मिलती है कि नियंत्रण को खींचा जा रहा है। –

3

शायद इनमें से कुछ सुझाव मदद कर सकते हैं।

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

(आप माता पिता फिर से कर सकते हैं किसी भी दृश्य नियंत्रण इस तरह से, अपनी मूल के अलावा और कुछ परिवर्तन किए बिना। मैं अत्यधिक यह इस तरह से कर रही सलाह देते हैं।)

आप पाठ के रूप में रूप में देख सकते हैं, और घोषणा आदेश के लिए कदम वहां के आसपास - लेकिन स्पष्ट रूप से आपको "संसाधन" फ़ाइल को संपादित करते समय सावधान रहना होगा।

आप डिज़ाइनर में टैब ऑर्डर सेट कर सकते हैं, ताकि आप टैब ऑर्डर के आधार पर एक अलग नियंत्रण कर सकें जो आप चाहते हैं। आप फॉर्म पर राइट क्लिक कर सकते हैं और गैर-दृश्य नियंत्रण के निर्माण क्रम को बदल सकते हैं, लेकिन यह दृश्य नियंत्रण के साथ काम नहीं करता है।

+0

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

+1

आप इसे इसके बजाय एक घटक संपादक बनाना चाहते हैं, फिर - दाएं माउस क्लिक से अपना यूआई पॉप अप करें, या पुराने-पुराने कदम को ऊपर/नीचे या उस नियंत्रण पर ड्रैग और ड्रॉप को लागू करें। –

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