掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オブジェクトの保存/復帰を実現するには? (ID:12128)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>(こちらのレスが遅くなってすいません) 取敢えず,質問しておいて... いい考えですが私は好きではないです. でも,折角反応があったので. まず,疑問点があります.TDataがTComponentから派生していますが, その中のSubDataもTComponentから派生していて独立形式である. SubDataのNameがreadだけなのに,書込みのコードがある,等々... というわけで,けんさんのコードでは,どの様な動作仕様なのか,私には 不明な部分があります.そこで, >基本的には、オブジェクトの保存/復帰を行いたいのですが という点に的を絞って(オブジェクトのリストは不要のようですので), 以下のコードを作成しました.実行してみてご希望の動作し仕様であれば 適当に変更してご利用下さい.もし,ご希望の動作仕様でなければ, あきらめて下さい(他の方のレスを期待して下さい). {$WARNINGS OFF} //==================================================================== // オブジェクト型の保存と読出し // // Project1 // // クラス型のオブジェクトのデータを扱うには // TCollection,TCollectionItem // TObject,TObjectList // 等を使用する方法の他,TComponent,TComponentListを利用する手もある. // TComonentを使用する方法は,ReadComponent,WriteComponentのメソッド // で直接オブジェクトの保存,読出しができる.コーディングは通常のコン // ポーネントの場合とほとんど同じである.以下は,リストは使用しないが // TDataというクラス型のオブジェクトを扱う例を示した.この例は機能的 // にはレコード型の単一レコードの保存,読出しとほぼ同じである. // // // 【テスト手順】 // (1)新規プロジェクト(重要です!!)にButtonを3つ,TMemoを1つ配置 // 必ず新規です(どうしてこれを守らない人がいるのかな.初心者と自分 // で名乗りながら...) // 確実に動作する簡単なコードで仕様を確認するのがベターです. // (2)このコードをコピペして各Buttonのイベントをオブジェクトインスペ // クタで選択. // (3)[F9]で実行してButton1をクリック(テスト用の値をセット) // (4)Button2をクリック(ファイルに保存) // (5)Formを閉じる(アプリの終了) // (5)再度[F9]で実行し,Button3をクリック // 保存していた値をMemo1に表示してMemo1のプロパティも変更 // // // 【動作確認環境】 // WindowsXP(SP2) // Delphi5(UP1) // // 2001.12.17〜 // http://homepage2.nifty.com/Mr_XRAY/ //==================================================================== unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSubData=class; TData = class(TComponent) private FIntVal : Integer; FColor : TColor; FFont : TFont; FSubData : TSubData; procedure SetFont(const Value: TFont); procedure SetSubData(const Value: TSubData); protected public constructor Create(AOwner: TComponent);override; destructor Destroy; override; published property IntVal : Integer read FIntVal write FIntVal; property Color : TColor read FColor write FColor; property Font : TFont read FFont write SetFont; property SubData : TSubData read FSubData write SetSubData; end; TSubData=class(TPersistent) private FName : String; FID : Integer; public published property Name : String read FName write FName; property ID : Integer read FID write FID; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private 宣言 } TestData : TData; AFileName : TFileName; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} { TData } //==================================================================== // TDataクラスのCreate //==================================================================== constructor TData.Create(AOwner: TComponent); begin inherited Create(AOwner); FSubData:=TSubData.Create; FFont:=TFont.Create; end; //==================================================================== // TDataクラスのDestroy.生成したオブジェクトも破棄 //==================================================================== destructor TData.Destroy; begin FreeAndNil(FSubData); FreeAndNil(FFont); inherited; end; //==================================================================== // Fontオブジェクトの設定 //==================================================================== procedure TData.SetFont(const Value: TFont); begin FFont.Assign(Value); end; //==================================================================== // SubDataオブジェクトの設定 // このプログラムでは必要な箇所はないのでwrite FSubDataでも可能であ // るが,後でエラーで悩まないために実装 //==================================================================== procedure TData.SetSubData(const Value: TSubData); begin FSubData.Assign(Value); end; //==================================================================== // Formを生成したらTDataクラスのオブジェクトTestDataも生成 // AFileNameは保存ファイル名 //==================================================================== procedure TForm1.FormCreate(Sender: TObject); begin TestData:=TData.Create(Self); AFileName:=ExtractFilePath(Application.ExeName)+'ATest.dat'; end; //==================================================================== // 動作確認用のデータをセット // もちろんこれらの値が固定であればTDataのconstractoreで設定しても // 構わない([Delphi Q & A 掲示板]の関係質問の方へのコメント) //==================================================================== procedure TForm1.Button1Click(Sender: TObject); var AFont: TFont; begin if Assigned(TestData) then begin AFont:=TFont.Create; try AFont.Size :=12; AFont.Color :=clBlue; TestData.Font:=AFont; TestData.IntVal :=2005; TestData.Color :=clSilver; TestData.SubData.Name:='Mr.XRAY'; TestData.SubData.ID :=1234567890; finally FreeAndNil(AFont); end; end; end; //==================================================================== // 現在のデータを保存 //==================================================================== procedure TForm1.Button2Click(Sender: TObject); var FileStream :TFileStream; begin FileStream := TFileStream.Create(AFileName,fmCreate); try if Assigned(TestData) then begin FileStream.WriteComponent(TestData); end; finally FileStream.Free; end; end; //==================================================================== // 保存してあるデータを読出して表示 //==================================================================== procedure TForm1.Button3Click(Sender: TObject); var FileStream : TFileStream; ATestData : TData; begin Memo1.Clear; //実行中の確認のためにTDataのオブジェクト生成 ATestData := TData.Create(Self); try FileStream := TFileStream.Create(AFileName,fmOpenRead); try FileStream.ReadComponent(ATestData); finally FileStream.Free; end; //読出したデータを表示 Memo1.Lines.Add(IntToStr(ATestData.IntVal)); Memo1.Lines.Add(ATestData.SubData.Name); Memo1.Lines.Add(IntToStr(ATestData.SubData.ID)); Memo1.Color:=ATestData.Color; Memo1.Font.Assign(ATestData.Font); finally //テストなのですぐ破棄 FreeAndNil(ATestData); end; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.