Массивы размером более 64К
Не существует способа непосредственного доступа к массиву размером свыше 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;
destructor Tmyarr.Free;
begin
if Self <> Nil then begin
buffer.Free;
Destroy;
end;
end;
procedure Tmyarr.GetElement(index: Word; p: Pointer);
begin
buffer.Seek(elsize * index, 0);
buffer.Read(p^, elsize);
end;
procedure Tmyarr.SetElement(index: Word; p: Pointer);
begin
buffer.Seek(elsize * index, 0);
buffer.Write(p^, elsize);
end;
[News Goup]