Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.48 MB
Время: 0.006 c
2-1221658980
smartleds
2008-09-17 17:43
2008.10.26
Господа, напомните пожалуйста функцию задержки в Делфи


15-1220428472
clickmaker
2008-09-03 11:54
2008.10.26
Неверный запрос в "Начинающих"


2-1221715346
Matveih1
2008-09-18 09:22
2008.10.26
Как предотвратить повторный запуск формы?


3-1208352253
SkyN
2008-04-16 17:24
2008.10.26
Программа на Delphi в качестве ODBC источника.


15-1220516578
md10
2008-09-04 12:22
2008.10.26
PCI Device установка драйвера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский