Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

Как мне написать процедуру Move для разных типов?   Найти похожие ветки 

 
Erik ©   (2004-01-29 17:41) [0]

Чтото вроде этого:
procedure MoveEx(const P1, P2: Pointer; Index: Integer);
begin
Move(P1^[i], P2^, SizeOf(P2^));
//Понятно, что SizeOf(P2^) вернет неправельное значение.
Inc(i, SizeOf(P2^));
end;

Вобщето мой вариант выглядит так:
Var
RecSize, ArraySize: Word;
i: Integer;
PData: PByteArray;
..
Move(PData^[i], RecSize, SizeOf(RecSize));
Inc(i, SizeOf(RecSize));


 
Sandman25 ©   (2004-01-29 17:45) [1]

Чем не устраивает обычный Move?


 
MBo ©   (2004-01-29 17:46) [2]

поясни, что именно тебе требуется


 
Digitman ©   (2004-01-29 17:49) [3]


> Erik © (29.01.04 17:41)


что-то ты загнул ..

я бы еще мог бы понять смысл написания такой проц-ры, если бы в ней не требовалось передавать как параметр размер копируемого блока ...


 
Erik ©   (2004-01-29 17:50) [4]

Это блок повторяется 10 раз, но морут быть разные типы данных!
Move(PData^[i], RecSize, SizeOf(RecSize));
Inc(i, SizeOf(RecSize));
Помоему естествено желаение заменить его одной процедурой.


 
Sandman25 ©   (2004-01-29 17:52) [5]

[4] Erik © (29.01.04 17:50)

Точнее, 10 вызовами
MoveEx(PData, i, RecSize, SizeOf(RecSize))???


 
Sandman25 ©   (2004-01-29 17:54) [6]

Кстати, если копируемые данные находились "рядом" и копируются в такой же блок, то их можно скопировать одним Move.


 
Erik ©   (2004-01-29 17:55) [7]

Ладно вот полный текст.
procedure DataToVariant1(Const Params: PRTKParams; Var VData: OleVariant);
Var
RecSize, ArraySize: Word;
PData: PByteArray;
i, SizeMem, ArrByteSize, SizeStn: Integer;
begin
RecSize := SizeOf(Params^);
SizeMem := Sizeof(RecSize);

ArrByteSize := GetByteSizeArr(@Params.TeenID, ArraySize);
SizeMem := SizeMem + ArrByteSize;
SizeStn := RecSize-SizeOf(Params^.TeenID);
SizeMem := SizeMem + SizeStn;

VData := VarArrayCreate([0, SizeMem],varByte);
PData := VarArrayLock(VData);
try
i := 0;
Move(RecSize, PData^[i], SizeOf(RecSize));
i := SizeOf(RecSize);
Move(SizeArray, PData^[i], SizeOf(SizeArray));
Inc(i, SizeOf(SizeArray));
Move(Params.TeenID[0], PData^[i], ArrByteSize);
Inc(i, ArrByteSize);
Move(Params^, PData^[i], SizeStn);
Inc(i, SizeStn);
finally
VarArrayUnLock(VData);
end;
end;


 
Digitman ©   (2004-01-29 17:55) [8]

кривой дорогой идете, товарисч)..

но если упрям, то м.б. поможет это :

function TypeInfo(TypeIdent): Pointer; (смотрим хэлп)


 
Erik ©   (2004-01-29 17:59) [9]

Какие не есть, зато мои! Быстрее идти дорогой которую знаш :)



Страницы: 1 вся ветка

Текущий архив: 2004.02.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
8-29478
Юрий Ж.
2003-09-19 08:53
2004.02.10
DirectSound?


9-29191
Sacred
2003-07-29 00:23
2004.02.10
Поле видемости в GLScene


14-29572
funtik
2004-01-20 12:04
2004.02.10
Интернет Эксплорер


3-29268
DimaF
2004-01-07 02:31
2004.02.10
Подскажите под что написать


1-29388
Breeze
2004-02-01 19:17
2004.02.10
Массив записей