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

Вниз

Как сохранять в файл массив из классов(или объекта), а точнее ег   Найти похожие ветки 

 
Stas_on   (2004-09-11 20:36) [0]

Как сохранять в файл массив из классов(или объекта), а точнее
его поля? И как потом его считать?
Пр. :

...............
Type
 THero = class
...............
   Lives,num,level : Integer;
...............
Var
 Heroes : array[1..//допустим 15] of THero;//Это нужно
                                           // сохранить

Вот, примерно так.


 
Arm79   (2004-09-12 00:22) [1]

к примеру если только integer-поля, то
var
 f: file of integer;

begin
 assignfile(f, FileName);
 rewrite(f);

 for i := 1 to Skolko_Nado
 begin
   write(f, Heroes[i].Lives));
   write(f, Heroes[i].num));
   write(f, Heroes[i].Level));
 end;

 closefile(f);

end;
----------------------------------

begin
 assignfile(f, FileName);
 reset(f);

 for i := 1 to Skolko_Nado
 begin
   read(f, Heroes[i].Lives));
   read(f, Heroes[i].num));
   read(f, Heroes[i].Level));
 end;

 closefile(f);

end;

Ето если знать кол-во объектов


 
Stas_on ©   (2004-09-12 10:36) [2]

В классе храниться ещё :

 name : string;
 Types : TMyTypes;
 Pict : TBitMap;

И много разной информации.
Так я заколибаюсь писать.
 --- А если используется наследие
                   ("Class of THeroes" или "^THerose")?


 
Arm79   (2004-09-12 19:12) [3]

Можно так

type
 THero = class
  ....
 procedure MySaveToFile(const FileName: string);
 procedure MyLoadFromFile (const FileName: string);
  ....
 end;

Определяешь в реализации метода MySaveToFile способ сохранения инфы. Поскольку используются разные типы данных, в том числе и сообственные, то придется использовать нетипизированные файлы или через TFileStream. А соглашения о записи придется придумывать самому. Например "name : string;" надо заменить на "name : ShortString;" (не думаю, что имя будет занимать больше 255 символов) и так далее. Это же соглашение надо использовать и при чтении из файла методом MyLoadFromFile;

а затем
 for i := 1 to 15
   do Heroes[i].MySaveToFile("Герой_"+IntToStr(i));

 for i := 1 to 15
   do Heroes[i].MyLoadFromFile("Герой_"+IntToStr(i));


 
evvcom ©   (2004-09-13 12:15) [4]

Что ж вы так боитесь этого string? Сохранить/прочитать string не так уж и сложно! Пишешь сначала длину, потом сам string и делов-то!


 
PVOzerski ©   (2004-09-13 12:26) [5]

Тут много идей реализации предложить можно, из "красивостей" (или "безобразностей" - кому как покажется :^)) -
1) объединение всех сохранаемых / читаемых полей в одно поле типа record - чтобы одним махом и не париться со сложением sizeof"ов. Конечно, для динамических массивов и длинных строк это бесполезно и даже вредно :^).
2) Запихнуть чтение в дополнительный конструктор, чтобы потом делать что-то вроде Obj[i]:=tObj.CreateFromFile(f);


 
Rem   (2004-09-13 13:05) [6]

А еще про контроль версий не забыть. По крайней мере, чтобы можно было расширять запись в процессе написания программы.

type
 THeroHeader = record
   Size: integer;
   // VersionLo: integer;
   // VersionHi: integer;
   ...
 end;

 THeroRec = record
   Lives: integer;
   Level: integer;
   ...
   // тут можно будет расширять при необходимости...
 end;

 THero = class
 private
   m_HeroRec: THeroRec;
 ...
 protected
   procedure InitDefault; virtual;
 public
   constructor CreateFromStream(a_Stream: TStream); virtual;
   property Level: integer read m_HeroRec.Level write ...;
 end;

...

constructor THero.CreateFromStream(a_Stream: TStream);
var
 TmpHeroHeader: THeroHeader;
 TmpHeroRec: ^THeroRec;
begin
 ...
 InitDefault;
 ...
 if (a_Stream <> nil) then
 begin
   m_Stream.Read(TmpHeroHeader, SizeOf(THeroHeader));
   GetMem(TmpHeroRec, TmpHeroHeader.Size);
   try
     m_Stream.Read(TmpHeroRec^, TmpHeroHeader.Size);
     Move(TmpHeroRec^, HeroRec, Min(TmpHeroHeader.Size, SizeOf(HeroRec));
   finally
     FreeMem(TmpHeroRec);
   end;
 end;
 ...
end;

procedure THero.InitDefault;
begin
 m_Hero.Lives := 1;
 m_Hero.Level := 1;
 ...
end;


Или воспользоваться published свойствами (или DefineProperties) и способностью TPersistent сохраняться в поток...


 
simpson ©   (2004-09-13 13:11) [7]

Неплохо бы описать свой интерфес сериализации/десериализации объектов (подобный ISerializable в .NET), и наследовать все свои классы от него... а то потом придется кроме THero сохранять еще какой-нить TMap...


 
Rem   (2004-09-13 13:25) [8]

[7] Это реализовано в TPersistent.


 
Erik1 ©   (2004-09-13 13:34) [9]

К слову все раследники от TPersistent умеют сами сохранятся в поток и востанавливатся из потока. Есть такая игрушка PegBoard.zip там используется RTTI для сохранения классов. Скачай пригодится.


 
Stas_on ©   (2004-09-13 15:03) [10]

Спасибо всем, но может кто дать ссылку(на основу)
или написать исходник. А то я в этом деле новичок.
Если что ещё нужно отметьте сдесь или напишите на E-mail!
Очень нужно! Срочно!


 
Stas_on ©   (2004-09-13 15:03) [11]

Спасибо всем, но может кто дать ссылку(на основу)
или написать исходник. А то я в этом деле новичок.
Если что ещё нужно отметьте сдесь или напишите на E-mail!
Очень нужно! Срочно!


 
icWasya ©   (2004-09-13 18:34) [12]

http://rsdn.ru/article/delphi/serialization.xml


 
Erik1 ©   (2004-09-17 10:30) [13]

А сам в Google зайти немог?
http://chris.lichti.org/Lab/Pegboard/Pegboard.shtml


 
Stas_on ©   (2004-09-17 15:33) [14]

Спасибо!


 
Stas_on ©   (2004-09-17 15:33) [15]

Спасибо!



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

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
6-1090889335
RaPToR_1
2004-07-27 04:48
2004.10.03
скачать twebbrowserom


1-1095214653
Артем К.
2004-09-15 06:17
2004.10.03
Ускорение запуска программы?


3-1094045087
1g0r
2004-09-01 17:24
2004.10.03
Кто знает что это за ошибка?


1-1095448396
4МО
2004-09-17 23:13
2004.10.03
TaskBar


14-1094873056
Aplay
2004-09-11 07:24
2004.10.03
Коллекция старых программ