No sé yo si esto te pueda servir. La idea es que dos unidades pueden usarse una a la otra siempre y cuando no sea ambas en la parte de
interface. En el ejemplo que te pongo factorizo por una tercera unidad común que ambas llaman desde su parte
interface. Esta unidad común contiene
interfaces a las clases, pero no implementan nada. Cada unidad Catalogos y Ventanas usan esta unidad común para poder declarar sus propiedades en la parte
interface. Pero es en la parte
implementation donde cada una llama a la otra para poder construir realmente el objeto que implementa la interfaz.
Código Delphi
[-]
unit Intf;
interface
type
IVentana = interface;
ICatalogo = interface
function GetVentana: IVentana;
end;
IVentana = interface
function GetCatalogo: ICatalogo;
end;
implementation
end.
-------------------------------------------------------------------------------
unit Catalogos;
interface
uses
Intf;
type
TCatalogo = class(TInterfacedObject, ICatalogo);
private
FVentana: IVentana;
public
function GetVentana: IVentana;
constructor Create;
end;
implementation
uses
Ventanas;
function TCatalogo.GetVentana: IVentana;
begin
Result := FVentana;
end;
constructor TCatalogo.Create;
begin
FVentana := TVentana.Create;
end;
end.
-------------------------------------------------------------------------------
unit Ventanas;
interface
uses
Intf;
type
TVentana = class(TInterfacedObject, IVentana);
private
FCatalogo: ICatalogo;
public
function GetCatalogo: ICatalogo;
constructor Create;
end;
implementation
uses
Catalogos;
function TVentana.GetCatalogo: ICatalogo;
begin
Result := FCatalogo;
end;
constructor TVentana.Create;
begin
FCatalogo := TCatalogo.Create;
end;
end.
Ahora, al margen de esto, pienso que es un poco raro que una clase, TCatalogo se encargue de su propia representación visual. De alguna manera esto la hace dependiente de la parte visual, cosa que no se recomienda. Quizá te convendría factorizar por un tercer objeto que se encargue de crear la ventana y pasarle los datos de un objeto TCatalogo.
// Saludos