Как сохранить объект в текущем состоянии в файл? Чтобы его можно было сразу читать и восстанавливать со всеми его переменными.
Сохранение TObject в файл
Ответ 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, которая поставляется с некоторыми из их компонентов.