Delphi toma el valor de I cuando se inicia el bucle. Si borras uno o mas elementos de la tabla, cuando I llega al valor inicialmente capturado Cod.Count-1 ya estas fuera de la tabla. Por ejemplo, tienes una tabla de 25 elementos, al inicio del bucle pascal determina que debe contar desde 0 hasta 24, si borras algun elemento de la tabla da igual, la cuenta llegará a 24, y como has borrado un elemento, cuando intentes borrar o comprobar el elemento num. 24 estas fuera de rango.
Lo mejor en esos casos es hacer un bucle While o Until.
Código Delphi
[-]
I=0;
while I < Cod.Count do
begin
...
Cod.Delete(I);
...
inc(I);
end;
Código Delphi
[-]
I=0;
repeat
...
Cod.Delete(I);
...
inc(I);
until I = Cod.Count;
Asi compruebas el valor de Cod.Count en cada pasada