Не существует способа непосредственного доступа к массиву размером свыше
65520. Или вы пользуетесь для распределения памяти GlobalAlloc или
TMemoryStream, и создаете специализированный класс для доступа к элементам
массива, или вы делаете это непосредственно вручную. Добраться до следующих
сегментов GlobalAlloc-ого объекта можно, строя указатели с помощью SelectorInc.
Самый легкий путь заключается в использовании TMemoryStream.
|
|
Type
Tmyarr = Class
buffer : TMemoryStream;
elsize : LongInt;
Constructor Create(esize, number : Word);
Destructor Free;
Procedure SetElement(index : Word; p : Pointer);
Procedure GetElement(index : Word; p : Pointer);
End; Implementation
Constructor
Tmyarr.Create(esize, number : Word); Var
size : LongInt; Begin
Inherited Create;
buffer := TMemoryStream.Create;
elsize := esize;
size := esize * number;
buffer.SetSize(size); End;
Procedure
Tmyarr.Free; Begin
If Self <> Nil Then
Begin
buffer.Free;
Destroy;
End; End;
Procedure
GetElement(index : Word; p : Pointer); Begin
buffer.Seek(elsize * index, 0);
buffer.Read(p^, elsize); End;
Procedure
SetElement(index : Word; ptr : Pointer); Begin
buffer.Seek(elsize * index, 0);
buffer.Write(p^, elsize); End; | |