オブジェクトを現在の状態でファイルに保存するにはどうすればよいですか?そのため、すべての変数を使用してすぐに読み取り、復元できます。
7 に答える
既に述べたように、最も簡単な方法はStreamとそのWriteComponentおよびReadComponentメソッドを使用することです。
ただし、次の点に注意してください。
-プレーンな TObject ではなく、 TComponent の子孫に対して機能します。
-公開されたプロパティ(dfm に保存されたもの) のみであり、公開されているものや (場合によっては) プライベートなものではありません。
-コンポーネントを復元するときは、Name プロパティに特に注意する必要があります。
これらの SO 回答で使用できるコードを見つけることができます: Delphi で実行時にビジュアル コンポーネントを置き換える 、実行時にコンポーネントを複製する
あなたが探しているのは、オブジェクトの永続性と呼ばれます。この記事が役立つかもしれません。また、「デルファイの永続化オブジェクト」をグーグルで検索すると、他にも多くの記事があります。
オブジェクトを 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.
SO には独自のXML メソッドもあります
- 非常にシンプルで効率的なソリューション: DragonSoft の XML クラス シリアライザー
また、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;
ここに良いチュートリアルがあります。このアプローチを使用して実行時にオブジェクトを保存するには、RTTI (実行時の型情報) が必要であるため、公開されたクラスのプロパティのみがキャプチャされることに注意してください。
あなたの質問に対しては、すでにいくつかの適切な回答が得られています。実際に行っていることによっては、事前に構築されたライブラリまたはコンポーネントを使用してオブジェクトを保存することが望ましい場合があります。これは安価で気の利いたライブラリ/コンポーネント セットであり、オブジェクトの永続化と復元を簡単にし、非常に簡単に (つまり、少しのコードで) オブジェクトの未公開メンバーの永続化にも対応します: http://www.deepsoftware. ru/rsllib/index.html ロケット科学のようなものではありませんが、この種のことをたくさん行っている場合、このコンポーネントは優れたフレームワークを提供します。
Developer Express には、一部のコンポーネントに付属する ExpressEditors ライブラリの一部として、汎用の cxPropertiesStore コンポーネントも含まれています。