Ich wuerde es mal so versuchen:

type
TMyImageArray = Array of Array of TImage;

procedure ClearArray(const bilder: TMyImageArray);
var
..felder: Integer;
begin
..felder:= Length(bilder);
..for i:= 1 to felder do begin
....for j:= 1 to felder do begin
......try
........if Assigned(bilder[i,j]) then begin
..........bilder[i,j].destroy;
..........bilder[i,j]:= nil;
........end;
......except
........on e: Exception do begin
..........// Write a log or show a message about the fuckup on i,j
........end;
......end;
....end;
..end;
end;


die zeile:
if (i <> ((felder div 2) + 1)) and (j <> ((felder div 2) + 1)) then
oder
if (i = ((felder div 2) + 1)) and (j = ((felder div 2) + 1)) then

ist mir ein raetsel, was bezweckst du damit?

Ich gehe mal davon aus das bilder ein 2-dimensionales array gleicher breite und hoehe ist, andernfalls knallts in der funktion sowieso. Warum also wird bei einem 10x10 array das element 6x6 ausgelassen, zumal du alle danach auf nil setzt. Das heist das du das element nicht freigibst aber es danach wegwirfst = Speicherschmutz, Macht keinen sinn fuer mich. Erklaer mal bitte was das ganze soll.

Wie auch immer die zeile sollte dann so heissen:
if ((i=j)and(j=((felder div 2)+1))) then continue;