お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"オブジェクトを保存/読み込み"



いろんなレコードを一つのファイルに保存する一つの方法。
レコードをTComponent以上のオブジェクトにしなくてはいけませんが
とても柔軟なデータの保存が可能です。が、TComponentoにしている分オーバー
ヘッドが若干乗ります。(約15byte/record?)

主にTNさんのご発言を勉強させていただきまして、自分なりにわかりやすいサ
ンプルを作っただけです。
nifty:FDELPHI/MES/16/00710
nifty:FDELPHI/MES/16/00717
nifty:FDELPHI/MES/08/00035 
などと要は一緒だと思いますが、
ある意味少しシンプルかもってなかんじです。(^^;
ボタン二つとListBoxを一つ使います。
実行時にはボタン1を押してからボタン2を押して下さい。





unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
Dialogs,
  StdCtrls, ExtCtrls;

type
  //保存するメンバーをpublished propertyにしない例
  TA=Class(TComponent)
  public
     a:integer;
     aa:Extended;
     procedure defineproperties(Filer:TFiler);overRide;
     procedure Readvalue(reader:TReader);
     procedure WriteValue(writer:TWriter);
  end;
  //保存するメンバーをpublished propertyにした例
  TB=Class(TComponent)
  private
     FB:shortString;
     FBB:string;
  published
     property b:shortString read FB write FB;
     property bb:string read Fbb write FBB;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//published しないpropertyを保存するために必要なルーチン
//ここから
procedure TA.defineproperties(Filer:TFiler);
begin
   inherited;
   Filer.DefineProperty('values', ReadValue, Writevalue, TRUE);
end;
procedure TA.ReadValue(reader:TReader);
begin
   a:=reader.ReadInteger;
   aa:=reader.ReadFloat;
end;
procedure TA.WriteValue(writer:TWriter);
begin
   writer.WriteInteger(a);
   writer.WriteFloat(aa);
end;
//ここまで
//published しないpropertyを保存するために必要なルーチン


//TDateModuleを使ってオブジェクトを保存
procedure TForm1.Button1Click(Sender: TObject);
var
   i:integer;
   a:TA;
   b:TB;
   DataModule:TDataModule;
   Stream : TFileStream;
begin
   DataModule:=TDataModule.create(self);
   for i:= 0 to 99 do
   begin
      //オブジェクトを作成してサンプルデータを作っていれてるだけ
      a:=TA.create(DataModule);
      a.a:=i;
      a.aa:=i/10;
      b:=TB.create(DataModule);
      b.b:='int='+intTostr(i);
      b.bb:='LongString='+intTostr(i);
   end;
   WriteComponentResFile('c:\poo.dat',DataModule);
   DataModule.free;
end;

//TDataModuleを使ってオブジェクトを読み込み
procedure TForm1.Button2Click(Sender: TObject);
var
   i:integer;
   DataModule:TDataModule;
   Stream : TFileStream;
begin
   DataModule:=TDataModule.create(self);
   //読み込んだときに生成も自動的にやってくれる
   ReadComponentResFile('c:\poo.dat',DataModule);

   //単に読み込んだオブジェクトのプロパティを表示するためのルーチン
   //読み込んだオブジェクトの利用方法のサンプルともいえる
   //一部しか表示していないのは単にしていないだけ他意はない
   for i:= 0 to DataModule.ComponentCount-1 do
   begin
      if DataModule.components[i] is TB then
      begin
         ListBox1.Items.add(TB(DataModule.Components[i]).bb);
      end
      else
      if DataModule.components[i] is TA then
      begin
         ListBox1.Items.add(
                 FloatToStr(
                   TA(DataModule.Components[i]).aa));
      end
   end;
   DataModule.free;
end;

initialization
    RegisterClasses([TA,TB]);
end.

                                 99/01/03(日) 13:22 凛(MXB01744)

Original document by 凛              氏 ID:(MXB01744)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum