Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сохранить экземпляр класса [D7, WinXP]


Zandrey ©   (2004-11-09 17:38:00) 

Как сохранить экземпляр класса в файле. И возможно ли это вообще в Delphi.
У меня такая ситуация - когда я сохраняю экземпляр, то никакой ошибки не возникает.
Но когда я пытаюсь его считать с файла возникает сообщение, которое говорит , что я обращаюсь в пустую область памяти (nill).


Digitman   (2004-11-10 17:18:00) [1]

боже, как меня "устал" этот скрипт и его интерпретатор(


> тебюя ноне


это и в кошмарном сне не приснится, очепяткой и не пахнет.


Digitman   (2004-11-10 17:01:00) [2]


> Zandrey ©   (10.11.04 16:54) [12]


подсказка тебе.

Создатель тоже не слепо копировал комбинацию св-в твоих отца/матери, когда сотворял тебя, т.е. сляпал тебя как заготовку, после чего назначая тебе будущие твои "свойства", уникально идентифицирующие тебюя ноне.

Делал/отвешивал он это последовательно :

- цвет глаз - такой-то;
- родинки - там-то;
- ума/таланта - столько-то
- дури - столько-то;

и т.д. и т.п.


Zandrey   (2004-11-10 16:54:00) [3]

Благодарю.
Теперь буду знать. Попробую реализовать двумя способами, ведь учиться надо то.
Тип MyType не классовая ссылка.


Zandrey   (2004-11-10 16:52:00) [4]

Благодарю.
Теперь буду знать. Попробую реализовать двумя способами, ведь учиться надо то.
Да и тип MyType не классовая ссылка.


jack128   (2004-11-10 16:30:00) [5]

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 - это, случайно, не классовая ссылка??? Тогда могут быть проблемы..


Юрий Зотов   (2004-11-10 16:23:00) [6]

> Zandrey ©   (10.11.04 15:52) [8]

Переменная _temp - это указатель на тело объекта и хранит его адрес (а само тело хранится по этому адресу в динамической памяти). Поэтому Вы записываете не сам объект, а его адрес. После уничтожения объекта этот адрес оказывается неверным и при обращении по нему возникает ошибка.

Как сделать - проще всего так, как показано в статье, но тогда придется наследовать Ваш класс от TComponent.


Zandrey   (2004-11-10 15:52:00) [7]

вот приблизительно мой код.
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 12:05:00) [8]

> jack128 ©   (09.11.04 21:24) [5]

> Persistent сохраняется только если он - published свойство
> компонента.

Какая разница? Главное, что он сохраняется - значит, механизм сохранения есть.

Как только у объекта появляется RTTI, этот объект может быть сохранен (GetPropList - и вперед). А RTTI по умолчанию появляется у TPersistent.

> GuAV ©   (09.11.04 21:51) [6]

Прямая запись области памяти не пройдет, если объект содержит хотя бы одну ссылку. Вернее, запись-то пройдет, а вот чтение...


GuAV   (2004-11-09 21:51:00) [9]

jack128 ©   (09.11.04 21:24) [5]

Хе. ну тогда WriteBuffer(Pointer(MyClass)^, MyClass.InstanceSize); :-)

Семен Сорокин ©   (09.11.04 18:05) [2]

В паскале в TV было constructor Load и procedure Store :)


jack128   (2004-11-09 21:24:00) [10]

Юрий Зотов ©   (09.11.04 18:05) [1]
2. Для наследников TPersistent есть уже готовые механизмы сохранения/чтения.


Где?? AFAIK, Persistent сохраняется только если он - published свойство компонента. Как самостоятельный объект он не сохраняется и сохранён быть не может.


begin...end   (2004-11-09 19:14:00) [11]

Zandrey ©   (09.11.04 17:38)

> У меня такая ситуация - когда я сохраняю экземпляр...

Скорее всего, Вы сохраняете указатель.


icWasya   (2004-11-09 18:28:00) [12]

например здесь
http://rsdn.ru/article/delphi/serialization.xml


Юрий Зотов   (2004-11-09 18:05:00) [13]

1. Сохранить в файл возможно все, что угодно - и в Delphi, и не в Delphi тоже.

2. Для наследников TPersistent есть уже готовые механизмы сохранения/чтения.

2. Начет ошибки - что можно сказать, не видя кода?


Семен Сорокин   (2004-11-09 18:05:00) [14]

имхо, надо сохранять его свойства, сделать что-то типа метода SaveToFile или SaveToStream и по аналогии LoadFromFile(LoadFromStream), а создавать его (Create) по-любому придется заново - на то он и "экземпляр" класса, реализацию можно глянуть к примеру у TGraphic.


Наверх

Титульная страница Поиск, карта сайта Написать письмо