Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.26;
Скачать: CL | DM;

Вниз

Как правильно сохранить / восстановить Variant в stream?   Найти похожие ветки 

 
Dmitry S ©   (2008-09-01 21:33) [0]

В логике программы вариант может быть целым числом, строкой либо датой.


 
palva ©   (2008-09-01 23:07) [1]

Можно сохранить в файл область памяти (8 байтов), которую занимает Variant. Но для типа String это будет недостаточно, да и не совсем корректно использовать знание о реализации Variant, которая в будущем может измениться.
Корректным вариантом будет: записывать в виде одного байта тип значения, а затем само значение (4, 8 байтов или в случае строки длина строки, содержимое строки). При восстановлении переменной читать из файла в обычную переменную, а потом присваивать его вариантной переменной.


 
Loginov Dmitry ©   (2008-09-01 23:31) [2]

> Как правильно сохранить / восстановить Variant в stream?


Используешь функции VarIsOrdinal(), VarIsStr(), VarIsFloat(), и в зависимости от результата присваиваешь значение варианта временной переменной, затем временную переменную "пихаешь" в stream, естественно с учетом всего, что сказано в [1].


 
Ega23 ©   (2008-09-02 00:44) [3]

Тэг, длина блока данных, данные.

Например:

type
 TBlockHeader = packed record
   BlockID : Longint;
   BlockSize : LongInt;
 end;

const

 bl_Sting = $0001;
 bl_Int    = $0002;
 bl_DateTime = $0003;

procedure VarToStream(const v : variant; stream : TStream);
var
 bh : TBlockHeader;
 s : string;
 dt: TDateTime;
 i : Integer;
begin
 case VarType(v) of
   varString : begin
                     s := v;
                     bh.BlockID := bl_String;
                     bh.BlocSize := Length(s);
                     stream.WriteBuffer(bh, SizeOf(bh));
                     stream.WriteBuffer(PChar(s)^, bh.BlockSize);
                  end;
   varInt :     begin
                     i := v;
                     bh.BlockID := bl_Int;
                     bh.BlocSize := SizeOf(Integer);
                     stream.WriteBuffer(bh, SizeOf(bh));
                     stream.WriteBuffer(i, bh.BlockSize);
                  end;
 end;
end;

Писал без Delphi, прямо тут на память. Возможны косяки. Но общая идея, надеюсь, понятна.


 
DevilDevil ©   (2008-09-02 11:04) [4]

вариант в общем случае может быть не только строкой или числом. Variant может быть указателем, многомерным массивом, интерфейсом и ещё много чем; если не заблуждаюсь, программист может назначить свой тип и способы его обработки. Если ты уверен, что в конкретном случае варианты будут таких-то типов, то при сохранении, от этих типов и отталкиваешься.


 
Юрий Зотов ©   (2008-09-02 12:09) [5]

> Ega23 ©   (02.09.08 00:44) [3]

> Тэг, длина блока данных, данные.

Одно поле лишнее, тэг и длину можно совместить. Например:

Tag = -2; // Целое, длина = SizeOf(Integer)
Tag = -1; // Дата, длина = SizeOf(TDate)
Tag >= 0; // Строка, длина = Tag


 
Ega23 ©   (2008-09-02 12:18) [6]


> Одно поле лишнее, тэг и длину можно совместить. Например:


В данном конкретном примере можно вообще на тэг отвести 2 старших ьита, остальное - длина блока.
Но когда тэгов дофига, да ещё и хочется группировки (эти в диапазоне [$2000 - $2FFFF], а эти - [$8000 - $9FFFF]), то лишние 4 байта не повредят...  :)


 
jack128_   (2008-09-02 13:00) [7]

Хм. А я, как человек ленивый, не придумывал алгоритмов, а просто скопировал реализацию стриминга вариантов из модуля SConnect.pas, который идет с дельфей..


 
Сергей М. ©   (2008-09-02 20:44) [8]


> jack128_   (02.09.08 13:00) [7]


Там, кажись, только массивы по ссылке не стримятся .. Или ошибаюсь ? (давненько не брал я в руки шашек)

А в целом оч даж верная "ленивось" - нафих нам велосипеды, если за них мальчиков не дают ?)


 
oxffff ©   (2008-09-02 21:37) [9]


>  если за них мальчиков не дают ?


Я честно говоря непонял это к чему.
:o)


 
oxffff ©   (2008-09-02 21:37) [10]


> oxffff ©   (02.09.08 21:37) [9]


непонял=не понял


 
Polevi ©   (2008-09-02 21:52) [11]

это из мультика


 
Ega23 ©   (2008-09-03 10:07) [12]


> Я честно говоря непонял это к чему.


Простоквашино, почтальон Печкин, велосипед.



Страницы: 1 вся ветка

Текущий архив: 2008.10.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
6-1194609413
Muxau
2007-11-09 14:56
2008.10.26
ICS THttpCli


8-1186482942
leonidus
2007-08-07 14:35
2008.10.26
Принцип работы инструментов автокоррекции изображений


2-1221810379
MaxX
2008-09-19 11:46
2008.10.26
Как узнать есть ли у компонента свойство Caption ?


15-1220323708
Slider007
2008-09-02 06:48
2008.10.26
С днем рождения ! 2 сентября 2008 вторник


2-1221640600
Drowsy
2008-09-17 12:36
2008.10.26
=Bookmark= и