function Read(L: TList; Index: integer): integer; begin if (Index > 0) and (L.Count > Index) then begin with L.Items[Index] do begin Lock; Result := Value; Unlock; end; end else raise ENotFound; end; procedure Write(L: TList; Index: integer; NewVal: integer); begin if (Index > 0) and (L.Count > Index) then begin with L.Items[Index] do begin Lock; Value := NewVal; Unlock; end; end else raise ENotFound; end; function Compare(L: TList; Ind1, Ind2: integer): integer; begin if (Ind1 > 0) and (Ind2 > 0) and (L.Count > Ind1) and (L.Count > Ind2) then begin L.Items[Ind1].Lock; L.Items[Ind2}.Lock; Result := L.Items[Ind2].Value - L.Items[Ind1].Value; L.Items[Ind2].Unlock; L.Items[Ind1].Unlock; end else raise ENotFound; end;