Las referencias circulares se deben a que el compilador entra en un bucle infinito al interpretar la cláusula USES. Simplificadamente:
Código Delphi
[-]
UNIT Unidad1;
INTERFACE
USES
Unidad2;
IMPLEMENTATION
END.
UNIT Unidad2;
INTERFACE
USES
Unidad1;
IMPLEMENTATION
END;
Cuando compilamos la Unidad1, el compilador entra en "INTERFACE" y encuentra "USES Unidad2", así que carga dicha unidad para compilar la sección INTERFACE de la misma. Ahí encuentra "USES Unidad1", así que la carga para compilar la sección INTERFACE, que contiene "USES Unidad2", así que la carga para compilar la sección INTERFACE, que contiene "USES Unidad1", así que la carga para... Creo que se me entiende.
La única forma de evitar esto es moviendo la cláusula USES a la sección IMPLEMENTATION, de forma que no sea accesible desde otros módulos.
Código Delphi
[-]
UNIT Unidad1;
INTERFACE
IMPLEMENTATION
USES
Unidad2;
END.
UNIT Unidad2;
INTERFACE
USES
Unidad1;
IMPLEMENTATION
END;
Aquí el compilador entra en "INTERFACE", la compila, luego entra en "IMPLEMENTATION" y encuentra "USES Unidad2" carga dicha unidad para compilar la sección INTERFACE de la misma. Ahí encuentra "USES Unidad1", así que la carga para compilar la sección INTERFACE. Cuando llega a la sección IMPLEMENTATION regresa a la Unidad2 y cuando termina de compilar la sección INTERFACE de esta continúa compilando la Unidad1.
Espero haberme explicado bien.