Как сохранить объект в его текущем состоянии в файл? Чтобы его можно было сразу читать и восстанавливать со всеми его переменными.Сохранение TObject в файл
ответ
То, что вы ищете, называется сопротивлением объекта. Этот article может помочь, и есть много других, если вы google для «delphi сохраняющихся объектов».
Возможно, человек использовал Google, который указал ему на Stackoverflow. «Спросить Google» - не настоящий ответ. Ответ Francois - это REAL (и полезный) ответ. – Ampere
There is a good tutorial here. Имейте в виду, что вам необходимо иметь RTTI (информацию о типе времени выполнения) для сохранения объекта во время выполнения с использованием этого подхода, поэтому он будет записывать только свойств класса.
Также есть рулонный XML method здесь, на S.O.
Если вы спускаете свой объект из 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.
Как уже говорилось, самый простой способ заключается в использовании поток и его WriteComponent и ReadComponent методы.
Но быть в курсе, что:
- это работает для потомков TComponent, не простой TObject;
- только для опубликованных свойств (сохраненных в dfm), а не публичных и (тем более) личных;
- вы должны обратить особое внимание на свойство Name при восстановлении компонента.
Вы можете найти код, который вы могли бы использовать в этих SO ответов: Replace visual component at runtime in Delphi, Duplicating components at Run-Time
Вы уже получили некоторые хорошие ответы на ваш вопрос. В зависимости от того, что вы на самом деле делаете, может быть желательно использовать предварительно созданную библиотеку или компонент для сохранения объектов. Это недорогой и изящный набор библиотек/компонентов, который делает его тривиальным для сохранения и восстановления объектов, и довольно легко (т. Е. С небольшим количеством кода) вмещает сохраняющиеся даже неопубликованные элементы объекта: http://www.deepsoftware.ru/rsllib/index.html Не то, что это ракетостроение, но если вы делаете много таких вещей, этот компонент обеспечивает хорошую инфраструктуру для этого.
Developer Express также включает компонент общего назначения cxPropertiesStore как часть библиотеки ExpressEditors, которая поставляется с некоторыми из их компонентов.
- Очень простое и эффективное решение: DragonSoft's XML Class Serializer
Также вы можете использовать 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;
Википедия говорит: «Множество значений атрибутов конкретного объекта называют его состояние.» Delphi фактически не имеет встроенного механизма для сохранения полного состояния объекта независимо от видимости, поддерживаются только опубликованные свойства. RTTI следует расширить, чтобы дополнительно включить все поля IMHO. – mjn
Насколько эта ситуация обновлена? – PSyLoCKe