Главная страница
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.018 c
14-16630
lipskiy
2004-01-14 00:29
2004.02.06
Как правильно пишется?


1-16438
SergeyMel
2003-12-25 11:49
2004.02.06
Как програмно переключить язык


1-16296
XenonXX
2004-01-20 03:55
2004.02.06
Delphi глючит?!?


3-16097
qwe
2004-01-16 09:57
2004.02.06
select FB 1.5 RC8


3-16093
kor@lex
2004-01-11 10:56
2004.02.06
DbMemo