11

如何将当前状态下的对象保存到文件中?这样就可以立即读取并恢复其所有变量。

4

7 回答 7

5

As already stated, the easiest way is to use a Stream and its WriteComponent and ReadComponent methods.
But be aware that :
- it works for descendants of TComponent, not plain TObject;
- only for the published properties (those saved in a dfm), not the public ones nor (a fortiori) the privwte ones;
- you have to pay a special attention for the Name property when restoring the component.

You may find some code you could use in these SO answers: Replace visual component at runtime in Delphi, Duplicating components at Run-Time

于 2009-03-30T19:57:54.213 回答
4

如果你从 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.
于 2009-03-30T19:28:03.347 回答
4

您正在寻找的是所谓的对象持久性。这篇文章可能会有所帮助,如果您在谷歌上搜索“delphi 持久对象”,还有很多其他文章。

于 2009-03-30T18:54:53.397 回答
2

在 SO上还有一个自己滚动的XML 方法

于 2009-03-30T19:05:18.833 回答
2
  1. 非常简单高效的解决方案:DragonSoft 的 XML Class Serializer
  2. 您也可以使用 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;
    
于 2009-04-13T12:10:19.680 回答
1

这里有一个很好的教程。请记住,您必须拥有 RTTI(运行时类型信息)才能使用此方法在运行时保存对象,因此它只会捕获类的已发布属性。

于 2009-03-30T19:04:03.280 回答
-1

你的问题已经得到了一些很好的答案。根据您实际执行的操作,可能需要使用预构建的库或组件来保存对象。这是一个便宜且漂亮的库/组件集,它使得持久化和恢复对象变得微不足道,并且非常容易(即,使用一点代码)适应持久化甚至对象的未发布成员: http://www.deepsoftware。 ru/rsllib/index.html 不是什么火箭科学,但是如果你做很多这类事情,这个组件会为它提供一个很好的框架。

Developer Express 还包括一个通用的 cxPropertiesStore 组件,作为 ExpressEditors 库的一部分,该库随一些组件一起提供。

于 2009-03-30T22:50:37.543 回答