|
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
|