Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
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

Última edición por marcoszorrilla fecha: 25-01-2007 a las 15:44:20.
Responder Con Cita
  #2  
Antiguo 25-01-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 25-01-2007
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #4  
Antiguo 25-01-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 25-01-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 25-01-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
mensaje de error UNIT.OBJ noe C++ Builder 7 19-07-2006 00:57:22
referencia circular melon OOP 1 16-04-2006 02:13:00
Problema unit2.dcu not found serhasae Varios 2 26-06-2005 13:23:03
object reference not set to arantzal Varios 3 27-01-2005 12:05:55
Essential XML Quick Reference jachguate Noticias 2 18-08-2004 18:59:19


La franja horaria es GMT +2. Ahora son las 02:09:57.


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
Copyright 1996-2007 Club Delphi