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

Вниз

Неустойчиво работает конвертация записи в variant.   Найти похожие ветки 

 
Erik ©   (2004-01-27 11:05) [0]

У меня есть две процедуры преобразования. Сначала конвертирую в Variant и отправляю на сервер, после обратное преобразование. Поработав на сервере с даными, опять делаю конвертацию и отправляю клинту. Посмотрите есть ли в них ошибка?

procedure DataToVariant(Const pTKParams: PRTKParams; Var VData: OleVariant);
Var Size: Integer;
PData: PByteArray;
Buf: Variant;
begin
Size := SizeOf(pTKParams^)-SizeOf(pTKParams^.TeenID);
VData := VarArrayCreate([0,1],Varvariant);

Buf := VarArrayCreate([0,Size-1],varByte);
PData := VarArrayLock(Buf);
try
Move(pTKParams^,PData^,Size);
finally
VarArrayUnLock(Buf);
end;
VData[0] := Buf;

Size := pTKParams^.Size*SizeOf(Cardinal);
Buf := VarArrayCreate([0,Size-1],varByte);
PData := VarArrayLock(Buf);
try
Move(pTKParams^.TeenID[0],PData^,Size);
finally
VarArrayUnLock(Buf);
end;
VData[1] := Buf;
end;
//-----------------------------------------------------------
procedure VariantToData(Var VData: OleVariant; Const pTKParams: PRTKParams);
Var Size: Integer;
PData: PByteArray;
Buf: Variant;
begin
Size := SizeOf(pTKParams^)-SizeOf(pTKParams^.TeenID);
Buf := VData[0];
PData := VarArrayLock(Buf);
try
Move(PData^,pTKParams^,Size);
finally
VarArrayUnLock(Buf);
end;

Size := pTKParams^.Size*SizeOf(Cardinal);
if Size > 0 then begin
Buf := VData[1];
SetLength(pTKParams^.TeenID,pTKParams^.Size);
PData := VarArrayLock(Buf);
try
Move(PData^,pTKParams^.TeenID[0],Size);
finally
VarArrayUnLock(Buf);
end;
end;

end;


 
Digitman ©   (2004-01-27 11:13) [1]

посмотри как это грамотно делается самим Борландом в методах

TDataBlockInterpreter.ReadVariant/WriteVariant

модуль SConnect


 
Erik ©   (2004-01-27 11:31) [2]

Возможно и грамотно, но там много всего и сложно. А мне конкретную структуру преобразовать надо было. Тоесть разбиратся пришлось бы значительно дольше чем написать самому. Если у кого скелет есть такой функции грамотно написаной, то был бы благодарен. Если он занимает больше двух страниц, то наверное нестоит.


 
Digitman ©   (2004-01-27 11:59) [3]


> Возможно и грамотно, но там много всего и сложно


ничего там сложного нет

к тому же мне кажется, что выкрутасы с непоср.записью в буфер вариантной переменной здесь лишние, если среди полей структуры TRTKParams фигурируют поля базовых типов (т.е. типов, совместимых с теми, которые фигурируют в VType)

например,

TMyRec = record
f1: Integer;
f2: Double;
f3: String;
f4: TDateTime;
end;

var
MyVar: Olevariant;
MyRec: TMyRec;
..

запись варианта :

with TMyRec do
MyVar =: VarArrayOf([f1, f2, f3, f4]);

запись структуры :

with TMyRec do
begin
f1:= MyVar[0];
f2:= MyVar[1];
f3:= MyVar[2];
f4:= MyVar[3];
end;


 
Digitman ©   (2004-01-27 12:07) [4]

кр.того, если таки ориентироваться на твой вариант, я бы поступил иначе :

- оформил бы тип TRTKParams как наследник TComponent
- "научил" бы TRTKParams писать/читать себя в/из потока
- осуществлял бы запись/чтение готового потока в вар.переменную "одним махом" :

MyVar := VarArrayCreate([0,Stream.Size-1],varByte));
PData := VarArrayLock(MyVar);
try
Move(PData^,Stream.Memory^, Stream.Size);
finally
VarArrayUnLock(MyVar);
end;

все !!



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

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

Наверх




Память: 0.48 MB
Время: 0.023 c
14-16670
goga
2004-01-18 23:12
2004.02.06
Изменение разрешения


1-16396
GooD-NTS
2004-01-22 20:41
2004.02.06
Большая проблема.


14-16609
Nick-From
2004-01-17 22:02
2004.02.06
Windows 2003 server


14-16728
Piter
2004-01-15 15:41
2004.02.06
Перегрузка операторов и Шаблоны


3-16085
Рустем
2004-01-10 10:43
2004.02.06
Проблемы со вставкой пустых значений