Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Как сохранить экземпляр класса   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1099337667
Луарвик
2004-11-01 22:34
2004.11.21
Как писать на апи?


14-1099678595
Ломброзо
2004-11-05 21:16
2004.11.21
Расскажите про Астану?


1-1100122006
SkyNet
2004-11-11 00:26
2004.11.21
Чужая программа и её самовосстанавливающаяся переменная


1-1100067542
markers
2004-11-10 09:19
2004.11.21
Раота с ограмадными числами.


1-1099671777
nick123
2004-11-05 19:22
2004.11.21
Передача указатель