Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.037 c
6-1095159757
xLoki
2004-09-14 15:02
2004.11.21
запуск dll из под Apache


3-1098641955
Robin Hood
2004-10-24 22:19
2004.11.21
Обновление базы данных с помощью UpdateSQL


3-1098368557
MORA
2004-10-21 18:22
2004.11.21
глюк в программе IB Console


8-1092984946
k-sergey
2004-08-20 10:55
2004.11.21
как в TlistBox изменить цвет полоски выделеного item-а?


1-1099494539
Настенька!!!
2004-11-03 18:08
2004.11.21
Цвет ячейки стриннгрида





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский