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