Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сохраниение record or class to binary [D7, WinXP]


Maxim____ ©   (2004-11-15 01:45:00) 

Приветствую!
Слышал краем уха, что можно сохранять структуры(а может быть и классы) как blob . Подскажите где копать,
Сразу вопрос, что происходит, если структура немного изменилась?
Тут конечно незаменим xml, но blob компактнее и непрозрачен, что и нужно.


cae   (2004-11-26 16:51:00) [1]

Вот, для примера :

type
TMyClass = class
 Field1 : Integer ;
 Field2 : Double ;
 Field3 : String ;
 
 procedure WriteStream(Strm : TStream);
 procedure ReadStream(Strm : TStream);
end ;
...................
procedure TMyClass.WriteStream(Strm : TStream);
var
Writer : TWriter ;
begin
 Writer := TWriter.Create(Strm,4096);
 try
  with Writer do
   begin
    WriteInteger(Field1) ;
    WriteFloat(Field2) ;
    WriteString(Field3) ;
   end ; //with Writer
 finally
  Writer.Free ;
 end ;
end ;

procedure TMyClass.ReadStream(Strm : TStream);
var
Reader: TReader ;
begin
 Reader := TReader.Create(Strm ,4096);
try
  with Reader do
  begin
   Field1 := ReadInteger;
   Field2 := ReadFloat ;
   Field3 := ReadString ;
  end ; // with Reader
finally
 Reader.Free;
end ;
end ;


Ken   (2004-11-26 16:34:00) [2]


> структура у меня сложная с динамическими массивами и проч.
> но сохранять её очень надо..

Если очень надо сохранить - попробуй привести свою стуктуру к фиксрованному размеру, при етом фиксируй размер каждой переменной!

Всю ету структуру описывай в тип "запись" recordи спокойно его сохраняй! Savetofile... LoadfromFile

Но учти, что тебе надо чтоб каждая переменная в типе записи имела фиксированный размер, т.е тебе придеться отказаться от перемен типа String (использую String[n], где n - его длина), от array of byte (придеться использовать array [0..n] of byte) и тд.


Digitman   (2004-11-26 16:25:00) [3]


> Maxim____   (26.11.04 16:17) [7]


впору бросать нафих "батонобросание" и садиться за "умные" книги.
и раз и навсегда уяснить для себя, ЧТО на самом деле представляет из себя содержимое пеоременной того или иного типа.

без этого - никуда.


Maxim____   (2004-11-26 16:17:00) [4]

структура у меня сложная с динамическими массивами и проч.
но сохранять её очень надо..

я не знаю как получить доступ к бинарному виду простой record
например состоящей из чисел и строк, без массивов?

второй вопрос.
как сделать перечисление элементов записи или класса.
возможно ли такое
if tclass().elements[0] is integer then... :)
или это бред?

жду ваших умных мыслей!


PVOzerski   (2004-11-16 12:13:00) [5]

IMHO, можно подумать об использовании TStream.ReadComponent и TStream.WriteComponent. Естественно, объекты и свойства подойдут уже не любые.


Amoeba   (2004-11-16 11:37:00) [6]


> Rem ©   (15.11.04 19:27) [3]
> А в чем проблема?
> record занимает участок памяти.
> Эту память и сохраняйте.


А если среди полей записи есть длинные строки или динамические массивы? Что тогда? См. Суслик ©   (15.11.04 19:24) [2]


Maxim____   (2004-11-16 01:06:00) [7]

>А в чем проблема?
>record занимает участок памяти.
>Эту память и сохраняйте.

простите за неосведомлённость,
как это сделать?
или в каком разделе хелпа прочитать о том как это сделать?


Rem   (2004-11-15 19:27:00) [8]

А в чем проблема?
record занимает участок памяти.
Эту память и сохраняйте.

>> если структура немного изменилась?
Где изменилась?


Суслик   (2004-11-15 19:24:00) [9]


> Слышал краем уха, что можно сохранять структуры(а может
> быть и классы) как blob

в blob сохранять можно все что хочешь.

В общем случае просто так сохранить запись (относится также и к классу) в blob нельзя, т.к. она может содержать ссылочные типы, например длинные строки.

Нужно каждый элемент записи сохранять и читать в отдельности.


Maxim____   (2004-11-15 19:20:00) [10]

люди добрые скажите что-нибудь по теме.


Наверх

Титульная страница Поиск, карта сайта Написать письмо