2009-03-30 16 views
10

オブジェクトを現在の状態でファイルに保存するにはどうすればよいですか?そのため、すべての変数を使用してすぐに読み取って復元することができます。TObjectをファイルに保存する

+0

ウィキペディアは言う:「特定のオブジェクトの属性の値のセットは、その状態と呼ばれています。」 Delphiには可視性に関係なくオブジェクトの完全な状態を保存するためのメカニズムが組み込まれておらず、公開されたプロパティのみがサポートされています。 RTTIは、オプションですべてのフィールドIMHOを含むように拡張する必要があります。 – mjn

+0

この状況は更新されていますか? – PSyLoCKe

答えて

4

あなたが探しているのはオブジェクト持続性と呼ばれます。このarticleは助けになるかもしれません。また、「delphi persisting objects」のためにgoogleしている場合は他にもたくさんあります。

+1

おそらく、その男はStackoverflowを指していたGoogleを使いました。 「Ask Google」は本当の答えではありません。フランソワの答えは、代わりにREAL (そして有益な)答えです。 – Ampere

1

There is a good tutorial here。このアプローチを使用して実行時にオブジェクトを保存するには、RTTI(実行時の型情報)を持たなければならないことに注意してください。のクラスのプロパティしかキャプチャしません。

2

S.Oには、ロールオーダーのXML methodもあります。

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

既に述べたように、最も簡単な方法は、ストリームとそのWriteComponentReadComponentメソッドを使用することです。
しかしは意識こと:
は - それはTComponentの、平野ないTObjectの子孫のためにに動作します。
公開されたプロパティ
(dfmに保存されたもの)であり、公開されたものでもprivwteものでもないものはのみです。
- には、コンポーネントを復元するときにNameプロパティに特に注意する必要があります。あなたはこれらのSOの答えに使用することができますいくつかのコードを見つけることができ

Replace visual component at runtime in DelphiDuplicating components at Run-Time

-1

は、あなたはすでにあなたの質問にいくつかの良い答えを得ています。実際に行っていることに応じて、オブジェクトを保存するためにあらかじめ構築されたライブラリやコンポーネントを使用することが望ましい場合があります。これは安価で気の利いたライブラリ/コンポーネントセットで、オブジェクトの永続化と復元が簡単で、コードのほんの少しで、オブジェクトの未公開メンバーでさえ永続することができます: http://www.deepsoftware.ru/rsllib/index.htmlロケット科学、この種のことをたくさんしているのなら、このコンポーネントは素晴らしいフレームワークを提供します。

Developer Expressには、コンポーネントの一部に付属する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; 
    
関連する問題