Телефон: +7 (926) 245-03-63

Массивы размером более 64К

Следующая статья: TTrackBar для эстетов.

Не существует способа непосредственного доступа к массиву размером свыше 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;