Форум: "Прочее";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];
ВнизКак правильно сохранить / восстановить 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c