Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-36701
Ил_204
2003-12-02 16:39
2003.12.12
окно Messages


1-36608
СержК
2003-12-01 12:59
2003.12.12
Форма по центру экрана


3-36561
BlackCat
2003-11-20 09:46
2003.12.12
Борьба с Ado


1-36601
Дремучий
2003-11-29 00:04
2003.12.12
Редактор свойства типа TImageList


6-36794
genek84
2003-10-16 09:29
2003.12.12
Как программно найти скрытые папки типа C$ на удаленной машине