Как можно сохранить объект в его текущем состоянии в файл? Чтобы его можно было сразу прочитать и восстановить со всеми его переменными.
Сохранение TObject в файл
Ответы (7)
Как уже говорилось, самый простой способ - использовать Stream и его методы WriteComponent и ReadComponent.
Но имейте в виду < / strong> что:
- он работает для потомков TComponent, а не для простого TObject;
- только для опубликованных свойств (сохраненных в dfm) , а не общедоступные или (a fortiori) частные;
- вы должны обратить особое внимание на свойство Name при восстановлении компонента.
Вы можете найти код, который вы могли бы использовать в этих ответах SO: Заменить визуальный компонент во время выполнения в Delphi, Дублирование компонентов во время выполнения- Время
То, что вы ищете, называется стойкостью объекта. Эта статья может помочь, и есть много других, если вы используете Google для "сохраняющиеся объекты 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.
- Очень простое и эффективное решение: Сериализатор классов 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;
Здесь есть хорошее руководство. Имейте в виду, что у вас должен быть RTTI (информация о типе времени выполнения) для сохранения объекта во время выполнения с использованием этого подхода, поэтому он будет захватывать только опубликованные свойства класса.
Вы уже получили хорошие ответы на свой вопрос. В зависимости от того, что вы на самом деле делаете, может быть желательно использовать предварительно созданную библиотеку или компонент для сохранения объектов. Это недорогой и изящный набор библиотек / компонентов, который упрощает сохранение и восстановление объектов и довольно легко (то есть с небольшим количеством кода) позволяет сохранить даже неопубликованные члены объекта: http://www.deepsoftware.ru/rsllib/index.html Это не ракетостроение, но если вы выполняя много такого рода вещей, этот компонент предоставляет для этого хорошую основу.
Developer Express также включает компонент cxPropertiesStore общего назначения как часть библиотеки ExpressEditors, которая поставляется с некоторыми из их компонентов.