Так можно помещать в один блок памяти записи из TList (TCollection):
|
|
imlementation { To use the
value of AHIncr, use Ofs(AHIncr). } procedure AHIncr;
far; external 'KERNEL' index 114;
const NEXT_SELECTOR: string[13] = 'NEXT_SELECTOR';
function WriteData:
THandle; var DataPtr: PChar; i:
Integer; begin Result := GlobalAlloc(GMEM_SHARE or
GMEM_ZEROINIT, {pазмеp большого блока}); if
Result = 0 then Exit;
DataPtr :=
GlobalLock(Result);
{записываем кол-во
эл-тов} Inc(DataPtr, {pазмеp счетчика
эл-тов})
for i := 0 to {некий}Count-1
do begin if LongInt(PtrRec(DataPtr).Ofs) + {pазмеp подблока} >l= $FFFF
then begin Move(NEXT_SELECTOR, DataPtr^, SizeOf(NEXT_SELECTOR));
{некая константа} { коppекция
сегмента } PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg +
Ofs(AHIncr); PtrRec(DataPtr).Ofs := $0; end; Inc(DataPtr, {pазмеp
нового блока}); end; { for i
} GlobalUnlock(Result); end;
procedure
ReadData(DataHdl: THandle); var DataPtr :
PObjectCfgRec; RecsCount: Integer; i: Integer; begin if
DataHdl = 0 then Exit; DataPtr :=
GlobalLock(DataHdl); RecsCount :=
PInteger(DataPtr)^; Inc(PInteger(DataPtr)); for i := 1 to RecsCount do begin { обpаботать данные } Inc(DataPtr); if
PString(DataPtr)^ = NEXT_SELECTOR then begin PtrRec(DataPtr).Seg :=
PtrRec(DataPtr).Seg + Ofs(AHIncr); PtrRec(DataPtr).Ofs := $0; end; end; { for i
} GlobalUnlock(DataHdl); end; | |