Текущий архив: 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.019 c