PRUZ का समाधान एक तैयार समाधान है; जेवीसीएल ओपन-सोर्स है, और जेवीफॉर्मस्टॉरेज का उपयोग करना आसान है। लेकिन आप किसी तीसरे पक्ष के घटकों का उपयोग किए बिना डेल्फी के स्वयं के स्ट्रीमिंग तंत्र का भी उपयोग कर सकते हैं। यहाँ एक उदाहरण है:।
procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
MemStream.WriteComponent(Component);
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;
SaveComponentToFile एक घटक उदाहरण के लिए, के साथ साथ एक फ़ाइल नाम लेता है, और फ़ाइल में घटक धाराओं, एक मानव पठनीय पाठ में
,210
फ़ाइल से घटक लोड करने के लिए, तो आप इस तरह एक कोड का उपयोग कर सकते हैं:
procedure LoadComponentFromFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i: Integer;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
try
for i := Component.ComponentCount - 1 downto 0 do
begin
if Component.Components[i] is TControl then
TControl(Component.Components[i]).Parent := nil;
Component.Components[i].Free;
end;
MemStream := TMemoryStream.Create;
ObjectTextToBinary(FileStream, MemStream);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
MemStream.Free;
FileStream.Free;
end;
end;
end;
LoadComponentFromFile एक घटक उदाहरण लेता है, और एक फ़ाइल नाम है, तो घटक उदाहरण में फ़ाइल की सामग्री लोड करता है। नामकरण संघर्ष से बचने के लिए, हम फ़ाइल डेटा लोड करने से पहले, उदाहरण के सभी मौजूदा स्वामित्व वाले घटकों को मुक्त कर सकते हैं।
अब आप एक फाइल में एक रूप को बचाने के लिए ऊपर दिए गए कोड का उपयोग कर सकते हैं:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm एक रूप उदाहरण है, और यह रूप में एक ही फ़ोल्डर के अंदर "formdata.txt" फ़ाइल में सहेजा जाएगा EXE फ़ाइल।
और से "formdata.txt" फ़ाइल FSecondForm लोड करने के लिए, हम इस बारे में:
if not Assigned(FSecondForm) then
FSecondForm := TfrmSecond.Create(Application);
LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm.Show;
LoadComponentFromFile उदाहरण पहले बनाने की आवश्यकता है, तो हम जाँच अगर FSecondForm असाइन किया गया है, अगर नहीं, हम एक बनाने इसका उदाहरण (यह TfrmSecond क्लास का एक उदाहरण है), और उसके बाद फ़ाइल डेटा लोड करें। और अंत में, हम भारित रूप दिखाते हैं।
धन्यवाद, यह अच्छा लगता है। अब मैं इसे लूप में लपेटूंगा और इसे रिकर्सिव कर दूंगा और मैं जाने जा रहा हूं। – Mawg
बच्चे के घटक को मुक्त करने से पहले माता-पिता को शून्य क्यों सेट करना? लूप के लिए पूरी तरह से, 'घटक' नहीं होगा। DestroyComponents 'चाल भी करता है? – NGLN
'LoadComponentFromFile()' 'घटक 'को' अनुप्रयोग' की स्वामित्व वाली घटकों की सूची में क्यों जोड़ रहा है? यह बिल्कुल ऐसा नहीं करना चाहिए। –