Текущий архив: 2003.12.12;
Скачать: CL | DM;
Вниз
Как сохранить класс Найти похожие ветки
← →
hooky-mars (2003-11-30 14:20) [0]Как сохранить любой класс в файл, или хотябы такой в котором не т процедур и функцый, а только переменные.
Просто в С++ такое возможно и очень удобно. Сохранил свой класс, потом когда надо выташил, и файл шифруестя и все переменные конценртируются в оном класе разом
← →
Digitman © (2003-11-30 14:26) [1]см., к примеру, TFileStream.WriteComponent()
← →
hooky-mars (2003-11-30 14:28) [2]
> Digitman © (30.11.03 14:26) [1]
Имеете в виду Ctrl+ клик по WriteComponent()?
← →
hooky-mars (2003-11-30 14:32) [3]
> Digitman © (30.11.03 14:26) [1]
Но там только TComponent, а мне надо сохранение произвельного класса, даже такого который не имеет родителей.
← →
Digitman © (2003-11-30 14:35) [4]имею ввиду, что, например, класс TFileStream, имея в своей реализации метод WriteComponent(), "умеет" сохранять в файл объекты-наследники класса TComponent
← →
hooky-mars (2003-11-30 14:37) [5]И не понятно куда идет запись, в память?
Может можно через OpenFile(),WriteFile(),CloseFile(). По крайней мере в С++ делалось, через что-то подобное, в Паскале не могу реализовать
← →
Digitman © (2003-11-30 14:38) [6]Борланд "упростил" тебе жизнь, "научив" наследников TPersistent созранять себя в поток (в т.ч. - ассоциированный с файлом)
← →
hooky-mars (2003-11-30 14:39) [7]procedure TStream.WriteComponent(Instance: TComponent);
begin
WriteDescendent(Instance, nil);
end;
Можно вместо TComponent поставить TMyClass?
← →
Digitman © (2003-11-30 14:43) [8]можно, если TMyClass есть прямой или непрямой наследник TComponent
← →
hooky-mars (2003-11-30 14:48) [9]
> Digitman © (30.11.03 14:43) [8]
Но мне не нужно наследование TComponent. Не ужели надо писать свой TFileStream? Длжно же быть решение по проше.
← →
Digitman © (2003-11-30 14:53) [10]
> Не ужели надо писать свой TFileStream?
скорее придется писать TMyClass.SaveToStream()/LoadFromStream(), где ты будешь волен указать, что, в каком виде и в какой последовательности сохранять в поток и считывать из потока.
← →
hooky-mars (2003-11-30 15:24) [11]
> Digitman © (30.11.03 14:53) [10]
Все я решил эту проблему, Просто я почити не пользовался TFileStream
...
type
TMyclass = class
private
{ Private declarations }
s:STring;
public
{ Public declarations }
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var w:TFileStream;
t:TMyclass;
begin
t:=TMyclass.Create;
w:=TFileStream.Create("eeee1.hm",fmOpenRead);
w.Read(t,sizeof(t));
w.Free;
Edit1.Text:=t.s;
end;
procedure TForm1.Button1Click(Sender: TObject);
var w:TFileStream;
t:TMyclass;
begin
t:=TMyclass.Create;
t.s:="fffff";
w:=TFileStream.Create("eeee1.hm",fmCreate);
w.Write(t,sizeof(t));
w.Free;
end;
← →
hooky-mars (2003-11-30 15:28) [12]Примерно таким же макаром это ришалось и в С++, посто в Паскале я пытался решить эту прблеме через апи CreateFile, а там какието проблемсы.
Спасибо за помошь!
← →
Digitman © (2003-11-30 15:32) [13]решил ты ее
1. Некрасиво и неизящно
2. С серьезными ошибками
← →
hooky-mars (2003-11-30 15:35) [14]
> решил ты ее
> 1. Некрасиво и неизящно
> 2. С серьезными ошибками
Ну так вразуми самоучку! Покажи как правильно.
← →
hooky-mars (2003-11-30 15:45) [15]
> Digitman © (30.11.03 15:32) [13]
Критиковатть легко, а ты приведи красивый пример, раз такой знаеш, что ж сразу непивел?
← →
Digitman © (2003-11-30 15:45) [16]для ДАННОГО случая :
type
TMyclass = class
private
{ Private declarations }
s:STring;
public
procedure LoadFromStream(ASrteam: TStream); virtual;
procedure SaveToStream(ASrteam: TStream); virtual;
{ Public declarations }
end;
...
procedure TMyclass.LoadFromStream(ASrteam: TStream);
var
len: Integer;
begin
AStream.Read(len, SizeOf(Len));
SetLength(s, len);
AStream.Read(s[1], len);
end;
procedure TMyclass.SaveToStream(ASrteam: TStream);
var
len: Integer;
begin
len := Length(s);
AStream.Write(len, SizeOf(Len));
AStream.Write(s[1], len);
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var w:TFileStream;
t:TMyclass;
begin
t:=TMyclass.Create;
try
w:=TFileStream.Create("eeee1.hm",fmRead);
try
t.LoadFromStream(w);
ShowMessage(t.s);
finally
w.Free;
end;
finally
t.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var w:TFileStream;
t:TMyclass;
begin
t:=TMyclass.Create;
try
t.s:="fffff";
w:=TFileStream.Create("eeee1.hm",fmCreate);
try
t.SaveToStream(w);
finally
w.Free;
end;
finally
t.Free;
end;
end;
← →
hooky-mars (2003-11-30 15:49) [17]Конечно это решение элегантнее и отслеживает искл. ситуации, но мое решение занимае тменьше места, как следствие моя програ грузится быстрее, на старых компах это имее большое значение.
Но спасибо за помашь и за пример буду иметь ввиду.
← →
Digitman © (2003-11-30 15:49) [18]
> раз такой знаеш, что ж сразу непивел
наследуй свой класс от TComponent - все будет ГОРАЗДО проще
← →
hooky-mars (2003-11-30 15:51) [19]У TComponent есть свои свойства они мне не нужны. Или я в чемто ошиваюсь?
← →
Digitman © (2003-11-30 15:52) [20]
> отслеживает искл. ситуации
это здесь ни при чем
> мое решение занимае тменьше места
именно ДАННОЕ твое решение, как быб быстро оно не работало, реализовано с грубой ошибкой и работать не будет, потому что в файл ты сохраняешь указатель на стр.данные, а не сами стр.данные
← →
Digitman © (2003-11-30 15:56) [21]
> hooky-mars
в случае с TComponent сохраняться/восстанавливаться автоматически будут только св-ва, декларированные тобой в секции published (и даже это можно сделать условно), все прочие св-ва автоматически не сохраняются и не восстанавливаются, если ты не примешь для этого спец.прогр.меры ... т.е. ничто лишнее в файл не попадет, если ты этого не захочешь сам, и , соотв-но лишнее время/файловое пространство на запись/чтение ненужных св-в затрачено при этом не будет
← →
hooky-mars (2003-11-30 15:57) [22]ХМ.. Действительно если создать файл, а потом загрузить прогру поновой и попытаться загрузить файл не чиго не выходит, а в сишке работало.
Призраю ты прав. Чтож очень благодарен за науку
← →
Digitman © (2003-12-01 08:19) [23]
> а в сишке работало
потому что "сишке" строковое поле по иному хранилось у тебя - не как указатель на данные, а как сами данные ... вот и "работало"
и здась бы "работало", если бы вместо String был применен тип String[]
← →
REA © (2003-12-01 10:33) [24]>как следствие моя програ грузится быстрее, на старых компах это имее большое значение.
Вот боюсь только, что твоя прога большого значения не имеет. Слушай дяденек - они хорошему научат.
← →
Polevi © (2003-12-01 11:58) [25]>hooky-mars (30.11.03 15:51) [19]
там 2 св-ва всего, если никак - наследуй от TPersistent и пиши свои процедуры сериализации-десериализации используя RTTI информацию.
а лучше воспользуйся советом Digitman, тебе будет в самый раз
Страницы: 1 вся ветка
Текущий архив: 2003.12.12;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.02 c