जहां तक इस रेखा के साथ मेरी अन्वेषण, हाँ की समस्या "पहले से मौजूद" नाम संपत्ति के लिए एक ही मूल्य के साथ संपादक की intances होने से उपजी है। जैसा कि एक और काम आसपास के रूप में संपादक (ओं) बनाते हैं। संपादक (ओं) के लिए TForm/TFrame/TPanel के आधार पर एक नया घटक बनाएं, जिसे आप चाहते हैं कि उपयोगकर्ता कई उदाहरण बना सके। आपको सृजन & किसी भी उप-नियंत्रण को हटाने, अपने गुणों को अपने कोड में सेट करने और मान निर्दिष्ट करने के लिए कोड करना होगा - V_Btn = new TBitBtn (this), V_Btn-> रंग = clTeal से V_Btn-> OnClick = Close_The_Window से कुछ भी । लेकिन कभी भी नई कक्षा में किसी भी घटक की नाम संपत्ति के लिए कोई मान निर्दिष्ट न करें और संपादक के उदाहरण बनाने के बाद संपादक की नाम संपत्ति सेट न करें। संपादक के लिए नाम संपत्ति का इलाज करें जैसे कि यह अस्तित्व में नहीं था। के बाद आप वर्ग बनाया है और अपनी परियोजना के लिए इसे जोड़ लिया है निम्नलिखित मान्य है:
TMyeditor* Editor_01 = new TMyeditor(Main_Form);
TMyeditor* Editor_02 = new TMyeditor(Main_Form);
Editor_01->Parent = Tab_Sheet_Addresses;
Editor_02->Parent = Tab_Sheet_Billing;
अपने संपादक वर्ग कोड करने के लिए आप undergoe होगा और अधिक प्रयास के लिए और अधिक जटिल डिजाइन अवधारणा। हालांकि यह दृष्टिकोण "पहले से मौजूद" त्रुटि को हल करेगा। के रूप में यह है कि तुम क्या आगे मैं इसे साथ मदद करने के लिए यह मामला होना चाहिए लिखना अपने कोड & के साथ क्या करना चाहते हो सकता है का एक विस्तार है
End of answer.
निम्नलिखित मूल प्रश्न के tangental है।
void RegisterClassesWithStreamingSystem(void)
{
// Make sure that as part of the startup
// code TMyEditor is registered
// with the streaming system.
#pragma startup RegisterClassesWithStreamingSystem
Classes::RegisterClass(__classid(TMyEditor));
}
: निम्नलिखित आप कुशलता से स्टोर करने के लिए, संपादक (s) और इस तरह के उपयोगकर्ता के स्क्रीन, थीम आदि पर स्थिति के रूप में अपनी प्रकाशित गुण पुनः प्राप्त आप ऊपर मार्ग चला गया है/जोड़ने की अनुमति देता है निम्नलिखित अब आप कंपोनेंट टॉस्ट्रिंग < ---> स्ट्रिंगटो कॉम्पोनेंट [* 1] संपादक (ओं) कर सकते हैं। अब आप प्रत्येक संपादक का एक सरल डेटाबेस बना सकते हैं [* 2] और रनटाइम पर संपादक को फिर से बना सकते हैं। & सहेजना लगभग पूरी तरह से TReader/TWriter ऑब्जेक्ट्स द्वारा किया जाता है। {यह लायक जबकि Treader/TWriter जो डेल्फी मदद फ़ाइल में शामिल है के बारे में पढ़ने के लिए है}
[presupposing आप TMyEditor के उदाहरणों आप Editor_01 & Editor_02 और बुलाया बचाने के लिए आप डाटासेट बना लिया है करना चाहते हैं और हालांकि यह संभावना है किया जाना चाहिए था - यह एक TClientDataSet नाम "सीडीएस"]
//How to write the Editors
String_Version_Of_Editor = ComponentToString(Editor_01);
CDS->Insert();
CDS->FieldByName("Data")->AsString = String_Version_Of_Editor;
CDS->Post();
String_Version_Of_Editor = ComponentToString(Editor_02);
CDS->Insert();
CDS->FieldByName("Data")->AsString = String_Version_Of_Editor;
CDS->Post();
//How to read, create an instance of, set the Owner of
//(allowing for automatic destruction/deletion
// if desired, Vis-à-vis Let the compiler/runtime package handle that),
//& setting the form's Parent
AnsiString String_Version_Of_Editor;
TWinControl* New_Editor;
String_Version_Of_Editor = CDS->FieldByName("Data")->AsString;
//The next line creates/constructs the new editor
New_Editor = StringToComponent(String_Version_Of_Editor);
//The next line sets the new editor's Owner to Main_Form
//It also assigns Main_Form the responsibility of object cleanup
Main_Form->Insert(New_Editor);
//The next line sets the Editor's Parent causing it to be part of the
//displayed user interface (it has been invisble since creation)
New_Editor->Parent = Tab_Sheet_Addresses;
//Move on to the next editor;
CDS->Next();
String_Version_Of_Editor = CDS->FieldByName("Data")->AsString;
New_Editor = StringToComponent(String_Version_Of_Editor);
Main_Form->Insert(New_Editor);
New_Editor->Parent = Tab_Sheet_Billing;
जो लोग उपरोक्त पढ़ लिया है, जो चतुर का उल्लेख किया है होगा कि उपरोक्त कोड में New_Editor प्रकार का है TWincontrol नहीं TMyEditor हैं करने के लिए आवंटित । हालांकि मैं इस किया था तथ्य संशय का विषय है डेल्फी में Treader वस्तु जो वास्तव में एक घटक वस्तु उदाहरण के लिए एक स्ट्रिंग परिवर्तित करने का काम कर रही है/निर्माण करती किसी भी वस्तु जो RegisterClass के माध्यम से स्ट्रीमिंग वर्ग के साथ पंजीकृत किया गया है बनाता है कि लोगों का ध्यान आकर्षित करने के लिए। इस तरीके से स्पष्ट रूप से नाम के नामकरण के माध्यम से संपादक की स्पष्ट रचना से बचा जाता है। यहां तक कि उस की आवश्यकता नहीं है अगर TWinControl * परे प्रकाशित गुण TMyEditor के दायरे से बाहर तक पहुँचा नहीं कर रहे हैं - - उदाहरण TMyEditor सोचा TMyEditor और उसके वंशज ही परिवर्तन के डिजाइन कोड के लिए आवश्यक करने के लिए दिया जाता है TMyEditor * करने के लिए TWinControl * बदलने के लिए है उन चरों तक पहुंच है जिनके मूल्यों को संपादित किया जा रहा है और इस जानकारी को संपादक को प्रदान करने की आवश्यकता नहीं है। (यदि डेटा मॉड्यूल से काम करना है, तो डेटामोड्यूल के हेडर को टीएमईडिटर में शामिल करें)।
साइड नोट: आपके पास यह जानने के लिए उपयोगिता हो सकती है कि डेटाबेस से कौन सी कक्षा पढ़ी गई थी ताकि आप उस उदाहरण को कह सकें जहां यह संबंधित है। अपने कोड में यह #include <typeinfo>
करने के लिए। उदाहरण: यदि आप डेटाबेस के लिए TMyEditor, TMyEditor_Generation_01, TMyEditor_Generation_02, आदि लिखा के उदाहरण है, तो आप पर निम्न बातें उदाहरणों यूजर इंटरफेस में प्लेसमेंट के लिए कार्यावधि में पढ़ जांच करने के लिए अनुमति देगा:
if (typeid(New).name() == "TMyEditor *")
New_Editor->Parent = Tab_Sheet_Addresses;
else
if (typeid(New).name() == "TMyEditor_Generation_01 *")
New_Editor->Parent = Tab_Sheet_Billing;
else
if (typeid(New).name() == "TMyEditor_Generation_02 *")
New_Editor->Parent = Tab_Sheet_Other_Editor;
typeid (_ _) .name() एक स्ट्रिंग लौटाएगा जो कक्षा का नाम है, इस मामले में "*" भी शामिल होगा।
उपर्युक्त किसी भी डेटाबेस में संग्रहीत करने के लिए ऑब्जेक्ट्स को पुनर्निर्मित करने और पुनर्निर्मित करने की अनुमति देता है। डेटाबेस के भीतर प्रविष्टियों को संबंधित होने की आवश्यकता नहीं है। डेल्फी के कोड में दफन किए गए ट्रेडर ऑब्जेक्ट रनवेटाइम पर तय करेंगे कि वे क्या हैं और सही कन्स्ट्रक्टर का उपयोग करते हैं।
[* 1] नोट: ComponentToString और StringToComponent delpi/C++ मदद फ़ाइल में उदाहरण हैं।
[* 2] नोट: क्या सहेजा जा रहा है प्रकाशित गुण है, इसलिए अपने संपादक कक्षा में किसी भी मूल्यों आप संग्रहीत और पुनः प्राप्त करना चाहते हैं जो पहले से ही विरासत में मिला और प्रकाशित की __published अनुभाग में घोषित किया जाना चाहिए नहीं कर रहे हैं आपकी नई कक्षा वे आइटम कस्टम ऑब्जेक्ट्स भी हो सकते हैं, जिनके लिए आप _property को परिभाषित करने में पढ़ने/लिखने के उपयोग विनिर्देशकों के लिए कोड कस्टम विशिष्ट विधियों/कार्यों की संभावना होगी। मैं विकास के दौरान अपने कोड की जांच करने में आसानी के लिए किसी भी जटिल वस्तु को स्ट्रिंग मान में अनुवाद करने का सुझाव दूंगा।
एर, यह 'LoadFromFile' विधि क्या है? यह आपके में से एक होना चाहिए, जब तक यह XE में कुछ जोड़ा नहीं जाता है। –
@ डेविड, मैंने 'लोडफ्रॉमफ़ाइल' का उल्लेख दो उत्तरों पर टिप्पणियों के कारण के रूप में किया है। चूंकि ओपी ने इसका उल्लेख नहीं किया है, मुझे लगता है कि यह 'LoadFromFile' नहीं है। ओपी द्वारा दिए गए कोड में –
@Lieven, एकमात्र जगह जहां यह असफल हो सकती है वह 'LoadFromFile' है। यह जानने के बिना कि हम क्या अनुमान लगा रहे हैं। यदि @Altar हमें यह बताना चाहता है कि 'LoadFromFile' क्या करता है तो मुझे यकीन है कि यह सब स्पष्ट हो जाएगा। –