Подтвердить что ты не робот

Сохранение TObject в файл

Как сохранить объект в текущем состоянии в файл? Чтобы его можно было сразу читать и восстанавливать со всеми его переменными.

4b9b3361

Ответ 1

То, что вы ищете, называется стойкостью объекта. Этот article может помочь, и есть много других, если вы google для "delphi persisting objects".

Ответ 2

Если вы спускаете свой объект из 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.

Ответ 3

Как уже было сказано, самый простой способ - использовать Stream и его методы WriteComponent и ReadComponent.
Но знать, что:
- он работает для потомков TComponent, а не простой TObject; - только для опубликованных свойств (сохраненных в dfm), а не публичных и (тем более) личных; - при восстановлении компонента вы должны обратить особое внимание на свойство Name.

Вы можете найти код, который вы можете использовать в этих SO-ответах: Заменить визуальный компонент во время выполнения в Delphi, Дублирующие компоненты во время выполнения

Ответ 4

Здесь также используется метод XML-метода

Ответ 5

Здесь есть хороший учебник. Имейте в виду, что вы должны иметь RTTI (информацию о типе времени выполнения) для сохранения объекта во время выполнения с использованием этого подхода, поэтому он будет захватывать только опубликованные свойства класса.

Ответ 6

  • Очень простое и эффективное решение: Сегментатор XML-классов DragonSoft
  • Также вы можете использовать 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;
    

Ответ 7

У вас уже есть хорошие ответы на ваш вопрос. В зависимости от того, что вы на самом деле делаете, может быть желательно использовать предварительно созданную библиотеку или компонент для сохранения объектов. Это недорогой и изящный набор библиотек/компонентов, который делает тривиальным сохранение и восстановление объектов, и довольно легко (т.е. С небольшим количеством кода) вмещает сохраняющиеся даже неопубликованные элементы объекта: http://www.deepsoftware.ru/rsllib/index.html Не то, что ракетостроение, но если вы много чего делаете, этот компонент обеспечивает хорошую основу для него.

Developer Express также включает компонент общего назначения cxPropertiesStore как часть библиотеки ExpressEditors, которая поставляется с некоторыми из их компонентов.