Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизРабота с указателем Найти похожие ветки
← →
Erik (2002-11-05 18:35) [0]Есть две процедуры для конвертации record в вариант
DataToVariant(Const pTKParams: PRTKParams; Var VData:OleVariant);
VariantToData(Var VData: OleVariant; Const pTKParams:PRTKParams);
pTKParams - описывается так
TArrayID = packed Array of Cardinal;
RTKParams = packed record
Kuupaev : Integer; //TDateTime;
Aeg : Integer;
TkAeg : Integer;
VAegID : Integer;
Size: Integer;
TeenID: TArrayID;
end;
PRTKParams = ^RTKParams;
Сложность состоит в копирывании TeenID
Копирую в 2 этапа DataToVariant(pTKParams, VData);
Size := SizeOf(pTKParams^)-SizeOf(pTKParams^.TeenID);
ASize := pTKParams^.Size*SizeOf(Cardinal);
VData := VarArrayCreate([0,Size+ASize-1],varByte);
PData := VarArrayLock(VData);
try
Move(pTKParams^,PData^,Size); - это правильно
Inc(PData,Size); - вот это вопрос??????
Move(pTKParams^.TeenID[0],PData^,ASize); - source правильный
но указатель кажется нетуда смотрит.
finally
VarArrayUnLock(VData);
end;
Помогите правильно скопировать запись и получить назад.
← →
Набережных С. (2002-11-05 21:18) [1]Если PData: PByte, то все правильно.
← →
Erik (2002-11-06 12:52) [2]Это описано PData: PByteArray;
как я понимаю variant имеет сложную структуру и неполучется взяв указатель PData := VarArrayLock(VData) просто прибавить к нему size. Очевидно внутри вариант дугая структура. А как прибавить size это сделать вопрос!
← →
Набережных С. (2002-11-06 14:19) [3]На кой нужен PByteArray? Сказано же - объяви PData типа PByte, на крайняк так сделай: Inc(PByte(PData), Size). Не нравится - сделай так: integer(PData):=integer(PData)+Size. Попробуй сделать Inc(P) при разных типах P: PInteger, PWord, PDouble и тд и посмотри , что происходит с P.
>как я понимаю variant имеет сложную структуру и неполучется взяв указатель PData := VarArrayLock(VData) просто прибавить к нему size
Есть старинная метОда: когда ничего не помогает, нужно попробовать почитать документацию. В данном случае - хелп. VarArrayLock дает указатель на плоский массив байт размером, заданным в VarArrayCreate, который не имеет никакого отношения к внутренней структуре Variant.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c