2012-06-06 9 views
33

मुझे एक पैकेज में परिभाषित डेल्फी घटकों की एक बड़ी संख्या को दूसरे पैकेज में समान रूप से बदलने की आवश्यकता है। डीएफएम फाइलों में टेक्स्ट (घटक प्रकार और गुण) को प्रतिस्थापित करके बहुत अधिक काम किया जा सकता है - पाठ्यक्रम के पाठ के रूप में सहेजा गया।डेल्फी डीएफएम फाइलों में अजीब [संख्या] एस - मूल और आवश्यकता?

मैं Stackoverflow और गूगल खोज की है और अब http://www.felix-colibri.com/papers/colibri_utilities/dfm_parser/dfm_parser.html

मैं DFM में एक 'सुविधा' के पार चलो फ़ाइलें कि पार्सर पर chokes से फेलिक्स Colibri DFM पार्सर अनुकूल रहा हूँ: प्रकार विनिर्देशों के बाद [संख्या] रों इस तरह:

inherited DialoogEditAgenda: TDialoogEditAgenda 
    ActiveControl = PlanCalendar 
    Caption = 'Agenda' 
    [snip] 
    inherited PanelButtons: TRzPanel 
    Top = 537 
    [snip] 
    inherited ButtonCancel: TRzBitBtn [0] <== *here* 
     Left = 852 
     [snip] 
    end 
    object CheckBoxBeschikbaarheid: TRzCheckBox [1] <== *here* 
     Left = 8 
     [snip] 
    end 
    inherited ButtonOK: TRzBitBtn [2] <== *here* 
     Left = 900 
     [snip] 
    end 
    end 
    inherited PageControl: TRzPageControl 
    Left = 444 
    [snip] 
    end 
    object PanelBeschikbaarheid: TRzSizePanel [2] <== *here* 
    Left = 967 
    [snip] 
    end 
    object PanelScheduler: TRzPanel [3] <== *here* 
    Left = 23 
    Top = 22 
    [...] 

इन DFMs से कई भारी विरासत में मिला रहे (मुझे लगता है कि पहले से ही के लिए Colibri के कोड अनुकूल करने के लिए किया था), लेकिन विरासत के साथ एक छोटे से परीक्षण एप्लिकेशन DFM में [संख्या] रों का उत्पादन करने में विफल रहा है।

पार्सर कोड का विस्तार करने से पहले मेरा प्रश्न: क्या किसी को पता है कि ये [संख्या] कहां से आते हैं और इसके परिणामस्वरूप, क्या मैं उन्हें डीएफएम फाइलों को पार्स करने से पहले हटा सकता हूं?

धन्यवाद

जनवरी

+1

निर्माण आदेश dfm फ़ाइल में उपस्थिति के क्रम द्वारा निर्धारित किया जाता है, इसलिए उन्मूलन की प्रक्रिया से इन्हें ज़ेड-ऑर्डर –

+0

निर्दिष्ट करना होगा [मैंने एक छोटा YouTube वीडियो] बनाया है (http://youtu.be/ _DLbTpIujYQ) जो आशा इस प्रश्न पर प्रश्न और उत्तर दोनों को वास्तव में स्पष्ट करती है, केवल एक चीज जो वास्तव में एचवीडी के उत्तर में जोड़ती है वह यह है कि यह फ्रेम और फॉर्म पर भी लागू होती है। – Alister

उत्तर

33

उन संख्याओं को पूरी तरह से बेकार नहीं हैं। मान लें कि आपके पास कक्षाएं TA, TB और TC, और TB और TC दोनों TA से प्राप्त हुई हैं। DFMs देखो की तरह:

object A: TA 
    object X: TX 
    end 
end 

inherited B: TB 
    object Y: TY 
    end 
end 

inherited C: TC 
    object Y: TY [0] 
    end 
    inherited X: TX [1] 
    end 
end 

B और C में मतभेद है कि उनके X और Y उप-घटक के क्रम उलट है। उपसंवेदनशील क्रम का सटीक अर्थ घटकों (नीचे देखें) पर निर्भर करता है, लेकिन सबसे विशेष रूप से, यदि वे TWinControl वंशज हैं, या वे TControl दोनों वंशज हैं जो TWinControl से प्राप्त नहीं होते हैं, जिसका अर्थ है कि वे XY पर दिखाए गए हैं , या YX से अधिक।

इन नंबरों को हटाने से फ़ॉर्म बदल सकते हैं, इसलिए आपको इसे अंधा नहीं करना चाहिए। हालांकि, आपके लक्ष्य के आधार पर, आप संख्याओं को छोड़ने के लिए पार्सर (स्रोत कोड उपलब्ध होना प्रतीत होता है) को संशोधित करने में सक्षम हो सकते हैं।

घटकों का सापेक्ष क्रम आमतौर पर अधिक मायने रखता नहीं है, लेकिन कुछ अपवाद हैं। कुछ और अधिक विस्तार से व्याख्या करने के लिए:

सामान्य नियंत्रण के लिए, उप-घटक (1) TControl वंश कि TWinControl से (3) किसी भी गैर TControl घटकों प्राप्त नहीं करते हैं, तो (2) TWinControl सन्तान, अंत में साथ शुरू करते हैं। इनमें से प्रत्येक में, घटकों का सापेक्ष क्रम समायोज्य है: नियंत्रण के लिए, "सामने लाएं" और "वापस भेजने के लिए" नियंत्रण को यथासंभव स्थानांतरित करें, इस सीमा के साथ कि एक गैर-TWinControl कभी भी बाद में नहीं रखा जा सकता TWinControl। गैर-नियंत्रण के लिए, (थोड़ा गलत नाम) "निर्माण आदेश" विकल्प आपको ऑर्डर बदलने की अनुमति देता है। तो, मान लें कि आपके पास दो लेबल (ए और बी), दो संपादन नियंत्रण (सी और डी), और एक डेटासेट और डेटा स्रोत (ई और एफ) हैं, आप उदाहरण के लिए ऑर्डर प्राप्त कर सकते हैं, एबीसीडीईएफ, बीएसीडीईएफ, एबीडीसीएफई , लेकिन एसीबीडीईएफ नहीं।

यह आदेश किसी डीएफएम फ़ाइल को सहेजते समय संरक्षित किया जाता है: जब दृश्य विरासत का उपयोग नहीं किया जाता है, तो घटक आसानी से सहेजे जाते हैं और फिर से लोड हो जाते हैं।जब आप विरासत का उपयोग करते हैं, तो डीएफएम फाइलों को प्राप्त करने के लिए संसाधित आधार मिलता है, इसलिए उपर्युक्त मामले में, जब TC बनाया जाता है, तो सदस्य हमेशाY सदस्य से पहले बनाया गया है। डेल्फी आरटीएल को बाद में आदेश को ठीक करने के लिए [0] और [1] की आवश्यकता है, उन मामलों में जहां घटक आदेश महत्वपूर्ण है।

घटक आदेश वास्तव में घटक प्रकार पर निर्भर करता है। जैसा कि "सामने लाएं"/"वापस भेजें" नाम बताते हैं, नियंत्रण जेड ऑर्डर निर्दिष्ट करने के लिए घटक आदेश का उपयोग करते हैं। अन्य घटक प्रकारों के लिए, इसका मतलब है कि घटक जो भी मतलब चाहता है उसका मतलब है। उदाहरण के लिए, मेनू अपने मेनू आइटम (ऊपर से नीचे) के क्रम निर्दिष्ट करने के लिए घटक आदेश का उपयोग कर सकते हैं। टूलबार नियंत्रण टूलबार बटन के ऑर्डर को निर्दिष्ट करने के लिए घटक ऑर्डर का उपयोग कर सकते हैं, भले ही वे टूलबार बटन स्वयं नियंत्रण न हों। डेटा सेट फ़ील्ड ऑर्डर निर्दिष्ट करने के लिए घटक आदेश का उपयोग करते हैं, और इस प्रकार TDBGrid में कॉलम का डिफ़ॉल्ट क्रम भी उपयोग करता है।

+6

+1। मैंने डीएफएम फाइलों में इस वाक्यविन्यास को कभी नहीं देखा है, जो प्रश्न और उत्तर दोनों को पढ़ने के लिए दिलचस्प है। –

+0

धन्यवाद। मुझे तब पार्सर अपडेट करना होगा (हां)। मैंने * डीएफएम से संख्याओं को हटाने की कोशिश की लेकिन आईडीई में ऐप को पुनः लोड करने के बाद वे स्वचालित रूप से फिर से दिखाई दिए। वे अलग-अलग थे, साथ ही डीएफएम फाइलों में घटकों के क्रम भी थे। –

+1

उन लोगों के लिए बस एक त्वरित अनुवर्ती जो एक ही काम करना चाहते हैं: हमने कोलिब्री पार्सर को त्याग दिया - इसे अनुकूलित करने के लिए बहुत अधिक काम। चूंकि हम वस्तुओं को घोंसले के तरीके में रूचि नहीं रखते हैं, इसलिए हम 'ऑब्जेक्ट'/'विरासत' से 'अंत' तक ASCII टेक्स्ट ब्लॉक को पार्स करते हैं, इन ब्लॉकों को संसाधित करते हैं और उन्हें वापस लिखते हैं। –

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