Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с указателем [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, то все правильно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо