2010-07-02 13 views
15

तो, मेरे पास कुछ दर्जन नियंत्रण के साथ एक फॉर्म है और कोई भी अपनी सामग्री और सेटिंग्स को पुनर्स्थापित करना चाहता है - बाद में रेडियो बटन का चयन किया गया था, उस अप/डाउन की स्थिति क्या थी,एक फॉर्म को कैसे सहेजना और पुनर्स्थापित करना है?

I रन टाइम पर किसी सूची बॉक्स में जोड़े गए किसी भी प्रविष्टि को भी स्टोर करना चाहेंगे।

ऐसा करने का सबसे आसान तरीका क्या है? DfmToString और रिवर्स? एक .INI लिखें/पढ़ें? कुछ और?

उत्तर

22

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 क्लास का एक उदाहरण है), और उसके बाद फ़ाइल डेटा लोड करें। और अंत में, हम भारित रूप दिखाते हैं।

+0

धन्यवाद, यह अच्छा लगता है। अब मैं इसे लूप में लपेटूंगा और इसे रिकर्सिव कर दूंगा और मैं जाने जा रहा हूं। – Mawg

+0

बच्चे के घटक को मुक्त करने से पहले माता-पिता को शून्य क्यों सेट करना? लूप के लिए पूरी तरह से, 'घटक' नहीं होगा। DestroyComponents 'चाल भी करता है? – NGLN

+0

'LoadComponentFromFile()' 'घटक 'को' अनुप्रयोग' की स्वामित्व वाली घटकों की सूची में क्यों जोड़ रहा है? यह बिल्कुल ऐसा नहीं करना चाहिए। –

2

घटक या ऑब्जेक्ट गुणों को पढ़ने/लिखना, या आईएनआई फ़ाइल या रजिस्ट्री में फॉर्म स्थिति बनाना बहुत आसान है। आपको जो कुछ भी चाहिए वह मदद में मौजूद है। आपको बस यह तय करने की आवश्यकता है कि आप उन्हें कब पढ़ना चाहते हैं (बनाने पर, दिखाए जाने से पहले ...) और उन्हें स्टोर करें (करीब, ...)। यह इस बात पर निर्भर करता है कि आप क्या सहेज रहे हैं/बहाल कर रहे हैं। यदि आप तैयार किए गए घटकों का उपयोग करने जा रहे हैं और फॉर्म स्थिति को सहेजना चाहते हैं, तो यह सुनिश्चित करना सुनिश्चित करें कि वे एकाधिक मॉनीटर का इलाज कैसे करते हैं। यदि आप इसे अपना रास्ता बना रहे हैं, तो आपको इसका ख्याल रखना चाहिए। उदाहरण के लिए, आपके पास एक लैपटॉप और एक बड़ा 22 "मॉनीटर हो सकता है, और आपके बड़े मॉनीटर का उपयोग करते समय एक फॉर्म की स्थिति सहेजी गई थी। बाद में, यदि आप लैपटॉप पर यह फॉर्म खोलते हैं तो यह स्क्रीन के प्रदर्शित हो सकता है ताकि आप देख सकें फॉर्म अगर इस मामले को सही तरीके से संभाला नहीं जाता है।

+0

+1 यह एक कम धावक है, लेकिन मुझे इसकी देखभाल करना सुनिश्चित होगा (सबसे बुरे मामले में, उपयोगकर्ता सहेजने वाली फ़ाइल को संपादित या नाम बदल सकता है) – Mawg

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