Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизКак сохранить экземпляр класса Найти похожие ветки
← →
Zandrey © (2004-11-09 17:38) [0]Как сохранить экземпляр класса в файле. И возможно ли это вообще в Delphi.
У меня такая ситуация - когда я сохраняю экземпляр, то никакой ошибки не возникает.
Но когда я пытаюсь его считать с файла возникает сообщение, которое говорит , что я обращаюсь в пустую область памяти (nill).
← →
Юрий Зотов © (2004-11-09 18:05) [1]1. Сохранить в файл возможно все, что угодно - и в Delphi, и не в Delphi тоже.
2. Для наследников TPersistent есть уже готовые механизмы сохранения/чтения.
2. Начет ошибки - что можно сказать, не видя кода?
← →
Семен Сорокин © (2004-11-09 18:05) [2]имхо, надо сохранять его свойства, сделать что-то типа метода SaveToFile или SaveToStream и по аналогии LoadFromFile(LoadFromStream), а создавать его (Create) по-любому придется заново - на то он и "экземпляр" класса, реализацию можно глянуть к примеру у TGraphic.
← →
icWasya © (2004-11-09 18:28) [3]например здесь
http://rsdn.ru/article/delphi/serialization.xml
← →
begin...end © (2004-11-09 19:14) [4]Zandrey © (09.11.04 17:38)
> У меня такая ситуация - когда я сохраняю экземпляр...
Скорее всего, Вы сохраняете указатель.
← →
jack128 © (2004-11-09 21:24) [5]Юрий Зотов © (09.11.04 18:05) [1]
2. Для наследников TPersistent есть уже готовые механизмы сохранения/чтения.
Где?? AFAIK, Persistent сохраняется только если он - published свойство компонента. Как самостоятельный объект он не сохраняется и сохранён быть не может.
← →
GuAV © (2004-11-09 21:51) [6]jack128 © (09.11.04 21:24) [5]
Хе. ну тогдаWriteBuffer(Pointer(MyClass)^, MyClass.InstanceSize);
:-)
Семен Сорокин © (09.11.04 18:05) [2]
В паскале в TV было constructor Load и procedure Store :)
← →
Юрий Зотов © (2004-11-10 12:05) [7]> jack128 © (09.11.04 21:24) [5]
> Persistent сохраняется только если он - published свойство
> компонента.
Какая разница? Главное, что он сохраняется - значит, механизм сохранения есть.
Как только у объекта появляется RTTI, этот объект может быть сохранен (GetPropList - и вперед). А RTTI по умолчанию появляется у TPersistent.
> GuAV © (09.11.04 21:51) [6]
Прямая запись области памяти не пройдет, если объект содержит хотя бы одну ссылку. Вернее, запись-то пройдет, а вот чтение...
← →
Zandrey © (2004-11-10 15:52) [8]вот приблизительно мой код.
TMyClass=class
...
privarte
Temp:MyType;
public
procedure writeMyClass(Temp:MyType);
function GetMyClass:MyType;
.....
end;
...
А вот как я пытаюсь записать и считать:_temp:=TMyclass.Create;
...
_temp.writeMyClass(...);
...
AssignFile(f,fName);//f:file of TMyClass
reWrite(f);
write(f,_temp);
closeFile(f);
...
считую....
//t:MyType
AssignFile(f,fName);
reset(f);
read(f,_temp);
t:=_temp.GetMyClass; //тут и возникает ошибка!
....
возможно я и пытаюсь сохранить указатель на класс, если да то как тогда? Или мне унаследовать другой класс.
Да, и спасибо за статью. Попробую.
← →
Юрий Зотов © (2004-11-10 16:23) [9]> Zandrey © (10.11.04 15:52) [8]
Переменная _temp - это указатель на тело объекта и хранит его адрес (а само тело хранится по этому адресу в динамической памяти). Поэтому Вы записываете не сам объект, а его адрес. После уничтожения объекта этот адрес оказывается неверным и при обращении по нему возникает ошибка.
Как сделать - проще всего так, как показано в статье, но тогда придется наследовать Ваш класс от TComponent.
← →
jack128 © (2004-11-10 16:30) [10]Zandrey © (10.11.04 15:52) [8]
возможно я и пытаюсь сохранить указатель на класс,
Не возможно, а так и есть.
> write(f,_temp); переменная _temp - это по сути - указатель.
Zandrey © (10.11.04 15:52) [8]
если да то как тогда? лбо по статье. Но думаю, это пока сложновато для тебя..
Пойди простым путем.
procedure TSameClass.LoadFromStream(Stream: TStream);
begin
Stream.ReadBuffer(FSameField, SizeOf(FSameField));
end;
procedure TSameClass.SaveToStream(Stream: TStream);
begin
Stream.WriteBuffer(FSameField, SizeOf(FSameField));
end;
зы Тип - MyType - это, случайно, не классовая ссылка??? Тогда могут быть проблемы..
← →
Zandrey © (2004-11-10 16:52) [11]Благодарю.
Теперь буду знать. Попробую реализовать двумя способами, ведь учиться надо то.
Да и тип MyType не классовая ссылка.
← →
Zandrey © (2004-11-10 16:54) [12]Благодарю.
Теперь буду знать. Попробую реализовать двумя способами, ведь учиться надо то.
Тип MyType не классовая ссылка.
← →
Digitman © (2004-11-10 17:01) [13]
> Zandrey © (10.11.04 16:54) [12]
подсказка тебе.
Создатель тоже не слепо копировал комбинацию св-в твоих отца/матери, когда сотворял тебя, т.е. сляпал тебя как заготовку, после чего назначая тебе будущие твои "свойства", уникально идентифицирующие тебюя ноне.
Делал/отвешивал он это последовательно :
- цвет глаз - такой-то;
- родинки - там-то;
- ума/таланта - столько-то
- дури - столько-то;
и т.д. и т.п.
← →
Digitman © (2004-11-10 17:18) [14]боже, как меня "устал" этот скрипт и его интерпретатор(
> тебюя ноне
это и в кошмарном сне не приснится, очепяткой и не пахнет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c