Pregunta

Tengo las dos clases siguientes:

TcmTPDataPanel = class(TcmTPBasePanel)
    Database: TnxDatabase;
    Session: TnxSession;
  private
    FDataConnector: TcmTPDataConnector;
    MyNxDataBase: TnxDatabase;
    MyNxSession: TnxSession;
    MyRefNxDataBase: TnxDatabase;
  protected
    procedure Disconnect; virtual; abstract;
    procedure Refresh; virtual;
    procedure Requery; virtual; abstract;
  public
    procedure Connect;
  published
    property DataConnector: TcmTPDataConnector read FDataConnector write
        FDataConnector;
  end;


TcmTPDataConnector = class(TComponent)
  private
    FDatabase: TnxDatabase;
    FObservers: TList;
    FTableForCategories: TnxTable;
    FTableForItemCategoryLinks: TnxTable;
    FTableForItems: TnxTable;
    procedure SetTableForItemCategoryLinks(const Value: TnxTable);
  protected
    procedure IterateObservers;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Register(Instance: TcmTPDataPanel);
    procedure Unregister(Instance: TcmTPDataPanel);
  published
    property Database: TnxDatabase read FDatabase write FDatabase;
    property TableForCategories: TnxTable read FTableForCategories write
        FTableForCategories;
    property TableForItemCategoryLinks: TnxTable read
        FTableForItemCategoryLinks write SetTableForItemCategoryLinks;
    property TableForItems: TnxTable read FTableForItems write FTableForItems;
  end;

TcmDataPanel es una (tercera generación) descendiente TFrame. No se utiliza directamente, sino una pluralidad de otros componentes compuestos descienden de él.

TcmDataConnector es un componente que mantiene la información de conexión de base de datos para estos otros componentes.

Estoy usando ModelMaker, y estoy tratando de implementar un patrón Observer "para que varios paneles de datos" se pueden actualizar automáticamente cada vez que el "conector de datos" cambia de estado.

Aquí está mi problema: Me parece que no puede evitar el problema "refernece circular", ya que cada clase utiliza la otra en la sección de interfaz. Poner la "usos" de referencia asociado en la sección de interfaz no arregla el problema "identificador no declarado", y poniendo a ambos en la misma unidad tampoco. En este momento están en la misma unidad (yo los he probado en unidades separadas, y juntos), y consigo el "identificador no declarado: TcmTPDataConnector" error.

¿Cómo puedo evitar esto?

================
ACTUALIZACIÓN:

Es viernes por la noche a las 9:30 pm donde estoy, y yo estaba totalmente atascado. A pocos minutos después de mi mensaje, la gente salvó el día !! (Noche!) GRACIAS !!

El hombre, amo Stackoverflow .... así que mi amigo en esta temporada de aprendizaje-como-loco. :) Gracias, gracias, gracias ...

¿Fue útil?

Solución

En la misma unidad, intente lo siguiente:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;

Otros consejos

Sin embargo, otra opción es utilizar las interfaces, pero creo que en este caso sería overengineered.

Hay dos opciones:

1) Póngalos en la misma unidad, el mismo bloque Tipo dentro de ella. declarar adelante TcmTPDataConnector, declarar el otro tipo y luego declararlo. (Ver post de jcinacio)

2) Hacer un antepasado de TcmTPDataConnector que contiene lo que tiene que estar disponible externamente y hacer sus referencias sean a eso. Esto es más de un dolor de cabeza, pero permite que lo haga a través de múltiples unidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top