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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.05 c
14-1094975356
Stef
2004-09-12 11:49
2004.10.03
Фракталы


9-1084003950
_dEMOn
2004-05-08 12:12
2004.10.03
Дорога


14-1094746899
gn
2004-09-09 20:21
2004.10.03
Intel изобрела дальнобойное Wi-Fi


1-1095272951
Sergokkke
2004-09-15 22:29
2004.10.03
RichView


8-1088862420
Tahion2
2004-07-03 17:47
2004.10.03
Как Разбить иконку на каналы (выделить Альфа-канал)





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