Форум: "Основная";
Текущий архив: 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.009 c