![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сохраниение 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]люди добрые скажите что-нибудь по теме.