![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сохранять в файл массив из классов(или объекта), а точнее ег [D6, Win95/98, WinXP]
Stas_on © (2004-09-11 20:36:00)Как сохранять в файл массив из классов(или объекта), а точнее
его поля? И как потом его считать?
Пр. :
...............
Type
THero = class
...............
Lives,num,level : Integer;
...............
Var
Heroes : array[1..//допустим 15] of THero;//Это нужно
// сохранить
Вот, примерно так.
Stas_on (2004-09-17 15:33:00) [1]Спасибо!
Stas_on (2004-09-17 15:33:00) [2]Спасибо!
Erik1 (2004-09-17 10:30:00) [3]А сам в Google зайти немог?
http://chris.lichti.org/Lab/Pegboard/Pegboard.shtml
icWasya (2004-09-13 18:34:00) [4]http://rsdn.ru/article/delphi/serialization.xml
Stas_on (2004-09-13 15:03:00) [5]Спасибо всем, но может кто дать ссылку(на основу)
или написать исходник. А то я в этом деле новичок.
Если что ещё нужно отметьте сдесь или напишите на E-mail!
Очень нужно! Срочно!
Stas_on (2004-09-13 15:03:00) [6]Спасибо всем, но может кто дать ссылку(на основу)
или написать исходник. А то я в этом деле новичок.
Если что ещё нужно отметьте сдесь или напишите на E-mail!
Очень нужно! Срочно!
Erik1 (2004-09-13 13:34:00) [7]К слову все раследники от TPersistent умеют сами сохранятся в поток и востанавливатся из потока. Есть такая игрушка PegBoard.zip там используется RTTI для сохранения классов. Скачай пригодится.
Rem (2004-09-13 13:25:00) [8][7] Это реализовано в TPersistent.
simpson (2004-09-13 13:11:00) [9]Неплохо бы описать свой интерфес сериализации/десериализации объектов (подобный ISerializable в .NET), и наследовать все свои классы от него... а то потом придется кроме THero сохранять еще какой-нить TMap...
Rem (2004-09-13 13:05:00) [10]А еще про контроль версий не забыть. По крайней мере, чтобы можно было расширять запись в процессе написания программы.
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 сохраняться в поток...
PVOzerski (2004-09-13 12:26:00) [11]Тут много идей реализации предложить можно, из "красивостей" (или "безобразностей" - кому как покажется :^)) -
1) объединение всех сохранаемых / читаемых полей в одно поле типа record - чтобы одним махом и не париться со сложением sizeof'ов. Конечно, для динамических массивов и длинных строк это бесполезно и даже вредно :^).
2) Запихнуть чтение в дополнительный конструктор, чтобы потом делать что-то вроде Obj[i]:=tObj.CreateFromFile(f);
evvcom (2004-09-13 12:15:00) [12]Что ж вы так боитесь этого string? Сохранить/прочитать string не так уж и сложно! Пишешь сначала длину, потом сам string и делов-то!
Arm79 (2004-09-12 19:12:00) [13]Можно так
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));
Stas_on (2004-09-12 10:36:00) [14]В классе храниться ещё :
name : string;
Types : TMyTypes;
Pict : TBitMap;
И много разной информации.
Так я заколибаюсь писать.
--- А если используется наследие
("Class of THeroes" или "^THerose")?
Arm79 (2004-09-12 00:22:00) [15]к примеру если только 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;
Ето если знать кол-во объектов