2009-03-30 13 views
10

किसी ऑब्जेक्ट को अपने वर्तमान स्थिति में, फ़ाइल में कैसे सहेज सकता है? ताकि इसे तुरंत अपने सभी चर के साथ पढ़ा और बहाल किया जा सके।फ़ाइल में एक टॉब्जेक्ट सहेजना

+0

विकिपीडिया कहते हैं: "एक विशेष वस्तु की विशेषताओं के मान के सेट अपने राज्य कहा जाता है।" डेल्फी वास्तव में दृश्यता के बावजूद पूर्ण ऑब्जेक्ट स्थिति को सहेजने के लिए कोई अंतर्निहित तंत्र नहीं है, केवल प्रकाशित गुण समर्थित हैं। वैकल्पिक रूप से सभी क्षेत्रों IMHO को शामिल करने के लिए आरटीटीआई को बढ़ाया जाना चाहिए। – mjn

+0

क्या यह स्थिति अपडेट की गई है? – PSyLoCKe

उत्तर

4

जो आप खोज रहे हैं उसे ऑब्जेक्ट दृढ़ता कहा जाता है। यह article मदद कर सकता है, और यदि आप "डेल्फी स्थायी वस्तुओं" के लिए Google हैं तो कई अन्य हैं।

+1

शायद उस आदमी ने Google का उपयोग किया जिसने उसे स्टैक ओवरफ्लो को इंगित किया। "Google से पूछें" वास्तविक जवाब नहीं है। फ़्रैंकोइस उत्तर इसके बजाय एक वास्तविक (और उपयोगी) उत्तर है। – Ampere

1

There is a good tutorial here। ध्यान रखें कि इस दृष्टिकोण का उपयोग करके किसी ऑब्जेक्ट को रन-टाइम पर सहेजने के लिए आपके पास आरटीटीआई (रन टाइम टाइप जानकारी) होनी चाहिए, इसलिए यह केवल को कक्षाओं के गुणों को प्रकाशित करेगा।

4

आप TComponent से अपने वस्तु उतरना, तो आप एक फाइल करने के लिए वस्तु स्ट्रीम करने के लिए कुछ अंतर्निहित कार्यक्षमता का उपयोग कर सकते हैं। मुझे लगता है कि यह केवल साधारण वस्तुओं के लिए अच्छा काम करता है।

आप पाने के लिए कुछ नमूना कोड शुरू किया:

unit Unit1; 

interface 

uses 
    Classes; 

type 
    TMyClass = class(TComponent) 
    private 
    FMyInteger: integer; 
    FMyBool: boolean; 
    FMyString: string; 
    public 
    procedure ToFile(AFileName: string); 
    published 
    property MyInteger: integer read FMyInteger write FMyInteger; 
    property MyString: string read FMyString write FMyString; 
    property MyBool: boolean read FMyBool write FMyBool; 
    end; 

implementation 

{ TMyClass } 

procedure TMyClass.ToFile(AFileName: string); 
var 
    MyStream: TFileStream; 
begin 
    MyStream := TFileStream.Create(AFileName); 
    try 
    Mystream.WriteComponent(Self); 
    finally 
    MyStream.Free; 
    end; 
end; 

end. 
4

जैसा कि पहले ही कहा गया है, सबसे आसान तरीका है एक स्ट्रीम और उसके WriteComponent और ReadComponent तरीकों का उपयोग करने के लिए है।
लेकिन बारे में पता दें कि:
- यह TComponent, सादे नहीं TObject के वंशज के लिए काम करता है;
- केवल प्रकाशित गुण (उन एक DFM में बचाया), नहीं सार्वजनिक वाले है और न ही (सुतरां) privwte लोगों के लिए ;
- आप जब घटक बहाल नाम संपत्ति के लिए एक विशेष ध्यान देना होगा।

आप आप इन अतः जवाब में इस्तेमाल कर सकते हैं कुछ कोड मिल सकता है: Replace visual component at runtime in Delphi, Duplicating components at Run-Time

-1

आप पहले से ही अपने प्रश्न का कुछ अच्छा जवाब मिल गया है। आप जो वास्तव में कर रहे हैं उसके आधार पर, ऑब्जेक्ट्स को सहेजने के लिए प्री-बिल्ट लाइब्रेरी या घटक का उपयोग करना वांछनीय हो सकता है। यह एक सस्ती और निफ्टी लाइब्रेरी/घटक सेट है जो वस्तुओं को जारी रखने और पुनर्स्थापित करने के लिए तुच्छ बनाता है, और बहुत आसानी से (यानी, कोड के थोड़े से थोड़ा) किसी ऑब्जेक्ट के निरंतर अप्रकाशित सदस्यों को समायोजित करता है: http://www.deepsoftware.ru/rsllib/index.html रॉकेट विज्ञान की कोई चीज़ नहीं है, लेकिन यदि आप इस तरह की बहुत सारी चीजें कर रहे हैं तो यह घटक इसके लिए एक अच्छा ढांचा प्रदान करता है।

डेवलपर एक्सप्रेस भी ExpressEditors पुस्तकालय है कि उनके घटकों में से कुछ के साथ आता है के हिस्से के रूप एक सामान्य प्रयोजन cxPropertiesStore घटक भी शामिल है।

1
  1. बहुत ही सरल और कुशल समाधान: DragonSoft's XML Class Serializer
  2. इसके अलावा, आप उपयोग कर सकते हैं JVCL TJvAppXMLFileStorage:

    का उपयोग करता JvAppXMLStorage;

    var 
        Storage: TJvAppXMLFileStorage; 
    begin 
        Storage := TJvAppXMLFileStorage.Create(nil); 
        try 
        Storage.WritePersistent('', MyObject); 
        Storage.Xml.SaveToFile('S:\TestFiles\Test.xml'); 
        Storage.Xml.LoadFromFile('S:\TestFiles\Test.xml'); 
        Storage.ReadPersistent('', MyObject); 
        finally 
        Storage.Free; 
        end; 
    end; 
    
संबंधित मुद्दे