Массивы размером более 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]