2009-11-03 12 views
5

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

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

हम बेस फॉर्म की स्थिति संपत्ति को poOwnerFormCenter पर सेट करके यह सब ख्याल रखते थे और यह बहुत अच्छा काम करता था। लेकिन मैं इस ऐप-वाईड को कैसे करूं?

मैंने स्क्रीन.ऑनएक्टिवफॉर्म चेंज का उपयोग करने के बारे में सोचा, लेकिन मुझे लगता है कि फॉर्म हर बार जब फोकस प्राप्त करता है तो ऐसा होता है। मैंने एप्लिकेशन.ऑनमोडालबिन का उपयोग करने के बारे में भी सोचा था, लेकिन इस बिंदु पर फ़ॉर्म को खोजने का एक स्पष्ट तरीका प्रतीत नहीं होता है।

क्या किसी ने यह कोशिश की है?

उत्तर

5

ठीक है, जाहिर है कि ठीक हल करने के लिए आप जिस समस्या को हल करने की कोशिश कर रहे हैं, उसे हल करने के लिए विरासत प्रदान की जाती है। कोई भी समाधान शायद किसी तरह से फॉर्म विरासत की नकल करने के लिए हवा में जा रहा है।

क्या आप "= class (TForm)" के लिए अपने कोड को विश्व स्तर पर खोजने के रूप में सरल बना सकते हैं और TForm क्लास को अपने मौजूदा बेस फॉर्म या एक नई, सरलीकृत बेस फॉर्म क्लास के साथ बदलकर केवल कार्यक्षमता के साथ बदल सकते हैं?

विफल होने के कारण, आप मूल टीएफओएम कक्षा को स्वयं को पोजिशनिंग व्यवहार करने के लिए संशोधित करने का प्रयास कर सकते हैं। जाहिर है, आपूर्ति की गई कक्षाओं को संशोधित करना खतरनाक पक्ष पर थोड़ा सा है।

+1

+1 मैंने आधार से छुटकारा पा लिया क्योंकि लोगों ने इसका उपयोग नहीं किया था और यह पुलिस को दर्द था। तो मैं वास्तव में यहां अपने तर्क को गलती करना चाहता हूं, लेकिन आप सही हैं। मुझे आधार के बिना एक या दो आवश्यकताओं की देखभाल करने के लिए अभी भी एक विश्वसनीय तरीका नहीं मिल रहा है, इसलिए मुझे लगता है कि मुझे इसे वापस रखना होगा। मुझे निश्चित रूप से लगता है कि मुझे विरासत के दृश्य भाग को छोड़ना चाहिए, क्योंकि यह ठीक से काम नहीं करता है। –

+0

मैं निश्चित नहीं हूं, लेकिन यह संभव है कि डेल्फी आईडीई को कम से कम उस कक्षा को पुलिस बनाने में आपकी सहायता करने के लिए कॉन्फ़िगर किया जा सके जिस पर नए फॉर्म आधारित हैं। –

0

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

+0

यहां समस्या स्केल है। हमारे पास कुछ सौ पैकेज हैं, जिनमें कई रूप हैं।आधार वर्ग (मुझे लगता है) यह सुनिश्चित करने का प्रयास था कि सभी रूप लगातार तरीके से व्यवहार करते हैं, लेकिन जैसे ही वर्षों बीत चुके हैं और लोग आए और चले गए, आधार का लगातार उपयोग नहीं किया गया था। मैं इस स्थिरता को लागू करने का प्रयास कर रहा हूं। –

4

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

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

0

मैं आमतौर पर SetBounds() प्रक्रिया का उपयोग करके फ़ॉर्मशो ईवेंट का उपयोग करता हूं। अन्य गैर-फॉर्म नियंत्रणों के साथ आप सीएमएसहॉइंग संदेश को ओवरराइड करके वही काम कर सकते हैं।

+0

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

0

मैंने ओनमोडालबिन का अपना विचार लिया और इसके साथ भाग गया। निम्नलिखित "हैक" है, लेकिन ऐसा लगता है कि यह काम करता है। बस फॉर्म के चारों ओर खींचने के लिए परीक्षण करें और बटन पर क्लिक करें।

procedure TMainForm.Button1Click(Sender: TObject); 
var 
    mForm: TForm; 
begin 
    mForm := TForm.create(self); 
    mform.width := 300; 
    mform.height := 300; 
    mForm.ShowModal; 
    mForm.Free; 
end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    application.OnModalBegin := modalbegin; 
end; 

procedure TMainForm.FormShow(Sender: TObject); 
begin 
    if Screen.FormCount>1 then begin 
    screen.forms[Screen.FormCount-1].left := round((screen.forms[Screen.FormCount-2].left + screen.forms[Screen.FormCount-2].width/2) - screen.forms[Screen.FormCount-1].width/2); 
    screen.forms[Screen.FormCount-1].top := round((screen.forms[Screen.FormCount-2].top + screen.forms[Screen.FormCount-2].height/2) - screen.forms[Screen.FormCount-1].height/2); 
    application.processmessages; 
    screen.forms[Screen.FormCount-1].Caption := inttostr(screen.forms[Screen.FormCount-1].top)+','+inttostr(screen.forms[Screen.FormCount-1].left); 
    end; 
end; 

procedure TMainForm.ModalBegin(Sender: TObject); 
begin 
    if Screen.FormCount>=0 then 
    screen.forms[Screen.FormCount-1].OnShow := FormShow; 
end; 
संबंधित मुद्दे