Вниз
Скачать: CL | DM;

Работа с указателем   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.02 c
3-59068
Crok
2002-10-30 15:55
2002.11.18
Счетчик записей в таблице


7-59443
Crush_fm
2002-09-16 22:07
2002.11.18
Как программно узнать общий объём HDD.


1-59235
Сатир
2002-11-03 15:22
2002.11.18
смысл этого объявления и в каких целях можно использовать?


3-59036
skiph
2002-10-29 06:51
2002.11.18
Поле datetime


1-59147
kserg@ukr.net
2002-11-08 18:19
2002.11.18
Как правильно определить свое событие и обработчик к нему




   Наверх