掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オブジェクトの保存/復帰を実現するには? (ID:12123)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんばんは、いつもお世話になりますケンです。 今回はDelphiでのオブジェクトの保存について質問させていただきます。 基本的には、オブジェクトの保存/復帰を行いたいのですが、復帰後の参照の解決の方法が分からないのです。 以下に具体的な例を挙げて説明します。 type TData = class(TComponent) private FSubData:TSubData; protected // OwnerとしてSelfを返すメソッド↓ function GetChildOwner():TComponent;override; // 自身が現在保持している子コンポーネントを返すメソッド↓ procedure GetChildren(Proc: TGetChildProc;Root: TComponent);override; published // 保存対象へのインタフェースを定義 property SubData:TSubData read FSubData write FSubData; end; TSubData = class(TComponent) // TSubDataはOWnerとしてTDataを持つ private FName:String; FID:Integer; published // 保存対象の実体を定義 property Name:String read FName; property ID:Integer read FID; end; のような形で定義されたクラスがあった場合、TDataというオブジェクトの まとまりでファイルに保存/復帰を実現するために以下のようなコードを利用 しました // ストリームへクラスの登録 initialization RegisterClasses([TData,TSubData]); // オブジェクトの保存 procedure TMain.SaveObject(FileName:String); var Memory:TMemoryStream; FileStream:TFileStream; begin FileStream := TFileStream.Create(FileName,fmCreate); Memory := TMemoryStream.Create; try if FData <> nil then // FDataはTDataのインスタンスです。 begin Memory.WriteComponent(FData); Memory.Seek(0, soFromBeginning); ObjectBinaryToText(Memory,FileStream); end; finally FileStream.Free; Memory.Free; end; end; // オブジェクトの復帰 procedure TMain.LoadObject(FileName:String); var Memory:TMemoryStream; FileStream:TFileStream; begin FileStream := TFileStream.Create(FileName,fmOpenRead); Memory := TMemoryStream.Create; try ObjectTextToBinary(FileStream,Memory); Memory.Seek(0,soFromBeginning); // FDataはTDataのインスタンスです FData := TData(Memory.ReadComponent(nil)); finally Memory.Free; FileStream.Free; end; end; 実行結果を見てみると、オブジェクトの保存は正常に行われているようなのですが、オブジェクトの 復帰の方がうまく処理されていないようです。 特に、TDataのなかのプロパティSubDataのように通常は「参照」として保持されている値の解決が正常に行われていないようです。 このような部分については何か特別なコードの記述が必要なのでしょうか? アドバイス、お願いいたします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.