![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с указателем [D5, Win2k]
Erik © (2002-11-05 18:35:00)Есть две процедуры для конвертации 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-06 14:19:00) [1]На кой нужен 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.
Erik (2002-11-06 12:52:00) [2]Это описано PData: PByteArray;
как я понимаю variant имеет сложную структуру и неполучется взяв указатель PData := VarArrayLock(VData) просто прибавить к нему size. Очевидно внутри вариант дугая структура. А как прибавить size это сделать вопрос!
Набережных С. (2002-11-05 21:18:00) [3]Если PData: PByte, то все правильно.