for j1 := 1 to 7 do begin
for i1 := 1 to 7 do begin
if ((i1 < 3) or (i1 > 5)) and ((j1 < 3) or (j1 > 5)) then Continue;
xy.X := (MPoint.X) -4 + i1;
xy.Y := (MPoint.Y) -4 + j1;
これだと画面端でやるとサーバとまると思います
if (xy.X < 0) or (xy.X >= tm.Size.X) or (xy.Y < 0) or (xy.Y >= tm.Size.Y) then continue;
こんな感じで範囲外への設置を回避しないとだめです