Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error: Circular unit reference to 'Unit2' (https://www.clubdelphi.com/foros/showthread.php?t=39620)

JM75 25-01-2007 14:57:23

Error: Circular unit reference to 'Unit2'
 
Hola, al compilar la aplicación me sale el error Circular unit reference to 'Unit2'. Para haceros una idea os hago un resumen, mi aplicación tiene una serie de unidades. algunas son las siguientes:
Código Delphi [-]
Código Delphi [-]
Unit1 (Formulario) 
 
interface uses Unit2
type 
  TMiForm=class(TForm)
  private
  ...........
  public
  ...........
  end;
 
  TClase1=class(TObject)
  private
    variable1:TClase2;
   .............
  public
  ...............
  end;
 
Unit2
interface
uses Unit3;
type
  TClase2=class(TObject)
  private
    variable1:TClase3;
    .............
  public
   ...............
  end;
 
Unit3 (Formulario)
interface
uses Unit1;
type
  TClase3=class(TMiForm)
  private
  .............
  public
  ...............
  end;




Al compilar me da el error de unidad circular al referencia Unida2. Mi problema está en que tengo que declarar las clases en las unidades tal como están ahora, y no puedo referencia las unidades en el "uses" de la parte de "implementation" ya que si no me daría error en la declaración de las clases.
Si a alguien se le ocurre alguna solución se lo agradecería.

Gracias de antemano

Ñuño Martínez 25-01-2007 15:19:28

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.

yusnerqui 25-01-2007 15:24:21

Hola, para evitar este tipo de errores es recomendable declarar los uses que tienen que ver con las unidades de tu aplicación justo debajo de la sesión implementación, es decir, debes mover las referencias a unit2 y unit3 que actualmente están en el uses que está debajo de la sesión interface para un nuevo uses que vas a declarar tú mismo debajo de la sesión implementación.

Espero que me hallas entendido y que esta solución resuelva tu problema.

Saludos Yuserqui

JM75 25-01-2007 15:41:27

Hola, os habéis explicado bien y os entiendo. Pero si hago eso se me presenta otro problema, en las unidades unit2 y unit3 hay clases que las declaro en la parte "interface" y que tienen atributos de un tipo declarados en las otras unidades, por lo que tengo que hacer referencia a esas unidades en el "uses" de la parte "interface" y no en "implementation".

No se si me he explicado bien o no. En el código del primer mensaje he puesto de manera resumida cómo están declaradas las clases.

Gracias.

Ñuño Martínez 25-01-2007 16:46:39

Entonces deberías planificarlo de otra forma. Tal vez usando interfaces o moviendo alguna clase a otra unidad nueva. Sin el código concreto es difícil darte una solución para esto.

JM75 25-01-2007 17:03:31

Hola Ñuño, he intentado mover clases a otras unidades pero ha sido imposible, las declaraciones de las clases que tengo me lo impedían.

Al final lo he resuelto de otra forma. Las variables de la clase de la unidad Unit2 las he declarado del tipo de una clase padre común con el tipo de las clases a las que me interesaba referenciar.

Despúes he referenciado las otras unidades en el "uses" del "implementation" para poder hacer "TClase(Variable)" -creo que se dice "cast"- en el desarrollo de los métodos.

No se si me he explicado.

Gracias por todo.


La franja horaria es GMT +2. Ahora son las 08:18:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi