Nomadic советует:
Так можно помещать в один блок памяти записи из 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; |
[001222]