Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Вниз

Как сохранить объект в фаил?   Найти похожие ветки 

 
Kvinta   (2006-05-17 13:26) [0]

Задача стоит следующим образом.
Есть некоторый тип типа object, состоящий из какихто полей и процедур/функция. Часть полей это массивы (безразмерные), элементы которого тоже некоторые объекты, и в этих обьектах тоже есть массивы с объектами.
Вопрос, как переменную этого типа со всей этой структурой запулить в фаил, и соответственно потом получить.
Я наивно надеялся в начале создания проекта что можно будет описать file of TMyType (структура которого описанна), наивный... :)
Подскажите плиз, буду очень благодарен.


 
TUser ©   (2006-05-17 13:36) [1]

SaveToStream


 
Альф   (2006-05-17 13:38) [2]

Научить каждый класс писать/читать TStream... далее по цепочке...


 
Kvinta   (2006-05-17 13:42) [3]

Можно на простом примере? С потоками не работал.
Ну например  из моей проги:
   TNet=Object
   private
   public
      X,Y:longint;
      Width,Height:Integer;
      Sourse:TCanvas;
      InPort:TInPort; {объект}
      OutPort:TOutPort; {объект}
      NeironValue:integer;
      Channel:array of TChannel;
      ChannelValue:Integer;
      Neiron:array of TNeiron; {Объекты, а в нем еще объекты}
      Constructor Create;
      Destructor Destroy;
      Procedure Draw;
      Procedure AddChannel(CStartNeiron,CStartPort,CStartPin,CEndNeiron,CEndPort,CEndPin,CNumber :integer);
      Function GetNextChannelNumber:Integer;
      Procedure DeleteChannel(NumberDel:Integer);
      Procedure DeleteNeiron(NumberDel:integer);
   end;


 
TUser ©   (2006-05-17 13:48) [4]

WriteComponentResFile


 
Kvinta   (2006-05-17 13:51) [5]

Мммм... И как я должен привести Свою переменную типа TNet к TComponent?


 
Сергей М. ©   (2006-05-17 13:59) [6]


> как я должен привести Свою переменную типа TNet к TComponent?


Никак.

Сделай класс TNet наследником TComponent - получишь массу удовольствия)

см. TPersistent.DefineProperties + TFiler.TPersistent.DefineProperty


 
Kvinta   (2006-05-17 14:10) [7]

Класс TNet? Он у меня не класс а обьект.
Простите, нехочу показаться навязчивым. Почитал я, попробовал, нифига не получается. Зря конечно я сразу не использовалл классы, а пошел по пути древнего паскаля, но сейчас чтобы перейти на классы нужно перелопатить уйму кода. :(


 
Сергей М. ©   (2006-05-17 14:15) [8]


> Класс TNet? Он у меня не класс а обьект.


Он у тебя класс !

Объект же есть экземпляр класса.


 
Kvinta   (2006-05-17 14:18) [9]

Ммммм... Диплом пишу называется :( Стыдно.
Я так понимаю класс был бы если бы. TNet=class (T...)
А у меня TNet=Object
Похоже я не догоняю... Разьясните плиз.


 
Сергей М. ©   (2006-05-17 14:24) [10]

Книжки бы тебе почитать умные, барин .. По программированию в Делфи ... В 2-х словах ведь не объяснить тебе, как защитить диплом не зная азов ...


 
Kvinta   (2006-05-17 14:28) [11]

Ну в свое оправдание мне нечего сказать. :(
Но всетаки на примере. Ка записать все в фаил. Если это конечно возможно. Кода уже больше 4000 строк. На новую структуру мне переходить сильно тяжко. Помогите.


 
MetalFan ©   (2006-05-17 14:37) [12]


> Он у тебя класс !
>
> Объект же есть экземпляр класса.

Вы не совсем правы.
TObject1 =  object
...
и
TClass1 = class
...

разные вещи.

первое -  - это пережиток паскаля...


> Я так понимаю класс был бы если бы. TNet=class (T...)
> А у меня TNet=Object

читаем хелп:
Object Types

The Win32 Delphi compiler allows an alternative syntax to class types, which you can declare object types using the syntax
type objectTypeName = object (ancestorObjectType)
       memberList
    end;
where objectTypeName is any valid identifier, (ancestorObjectType) is optional, and memberList declares fields, methods, and properties. If (ancestorObjectType) is omitted, then the new type has no ancestor. Object types cannot have published members.

Since object types do not descend from Borland.Delphi.System.TObject, they provide no built-in constructors, destructors, or other methods. You can create instances of an object type using the New procedure and destroy them with the Dispose procedure, or you can simply declare variables of an object type, just as you would with records.

Object types are supported for backward compatibility only.

т.е. работа с типами TXXX = object
сродни работе с record...
и использовать их не рекомендуются, осталены для обратной совместимости


 
Kvinta   (2006-05-17 14:42) [13]

Ну вот, и я про тоже!!!!

"Delphi поддерживает две модели представления объектов — старую и новую. Старая модель существует лишь для совместимости с более ранними версиями компилятора, в частности с Borland Pascal 7.0, поэтому мы не будем ее рассматривать. Все, что сказано ниже, относится к новой модели представления объектов, более мощной и богатой по своим возможностям.
Для поддержки ООП в язык Object Pascal введены объектные типы данных, с помощью которых одновременно описываются данные и операции над ними. Объектные типы называют классами, а их экземпляры — объектами."

А то у меня комплекс неполноценности начал развиваться! Дык что делать то? Если объект не записать, как с минимальными потерями к классам перейти? Если просто слово обьект заменить на класс, куча ошибок, и чтобы их раскопать........... Ужасть.....


 
Amoeba ©   (2006-05-17 14:51) [14]

Изучаем статью: http://rsdn.ru/article/delphi/serialization.xml


 
Сергей М. ©   (2006-05-17 14:54) [15]


> Kvinta   (17.05.06 14:42) [13]


Уникальность объекта определяется уникальностью совокупности его свойств.
Для того чтобы воспроизвести объект нужно воспроизвести его свойства.
Чтобы воспроизвести свойства нужно их сохранить (в некоей произвольно выбранной последовательности) и восстановить (в той же последовательности).


 
TStas ©   (2006-05-17 15:44) [16]

А разве TPersistan не умеет сохранять? Уж тем более TComponet. Но можно и каждый в поток сохранять. Именно так я и делал. Когда написал из любопытства электронные таблицы, мне интересно было, как они работают, научил объекты сохраняться в поток и грузиться из него. И все, циклов в файловый поток все и сохранял. Сохранять нужно только поля, именно они и отпределяют уникальность каждого объекта. Чтобы не ходить далеко за примером, достаточно открыть блокнотом dfm. Достаточно сложный объект, содержащий в качестве полей другие объекты, форма, сохраняется в поток и грузится из него. При этом сохраняются поля, значения которых отличны от умалчиваемых. Потом, если наследовать от TComponent если прямо в справке дельфей функции ComponentToStr и StrToComponent. Соответственно сохраняющие и загружающие компонент в строку. Притом строка вполне читаемая, как в dfm. Только чтобы загружать объект из текстового потока его надо вначале создать. Специально пробовал, все замечательно сохраняется/грузится.


 
Algol   (2006-05-17 16:08) [17]


> Можно на простом примере? С потоками не работал.


Вот простой пример, запись в поток:

procedure TNet.SaveToStream(stream: TStream);
var Count:Integer;
 i:Integer;
begin
//пишем поля
 stream.Write(self.X, sizeof(self.X));
 stream.Write(self.Y, sizeof(self.Y));
....
//здесь пишем число элементов массива
 Count:=Length(Channel);
 stream.Write(Count, sizeof(Count));
//пишем массив
 for i:=0 to high(Channel) do
   Channel.SaveToStream(stream);
end;


 
Kvinta   (2006-05-17 16:22) [18]

Всем спасибо, буду разбираться!


 
Сергей М. ©   (2006-05-18 08:40) [19]


> TStas ©   (17.05.06 15:44) [16]



> разве TPersistan не умеет сохранять?


Сам по себе не умеет. Но он предоставляет весьма удобный унифицированный механизм сохранения\восстановления объектов, классы которых являются его наследниками.


> Уж тем более TComponet


TComponent умеет сохранять\восстанавливать published-свойства, а для прочих св-в как раз и придуманы TPersistent.DefineProperties + TFiler.DefineProperty



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
11-1129621644
Боб
2005-10-18 11:47
2006.06.25
KOLECMLISTEDIT ошибки при компиляции


2-1149583935
Piero
2006-06-06 12:52
2006.06.25
Как отобразить html страницу


2-1149614650
Mr tray
2006-06-06 21:24
2006.06.25
Нужно ли выделять память для #0 в null-terminated string


15-1148836161
Efir
2006-05-28 21:09
2006.06.25
Эфиродинамика


2-1149773285
Zikmu
2006-06-08 17:28
2006.06.25
Нумерация строк





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский