Pergunta

Eu tenho as duas classes seguintes:

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 é um (3ª geração) TFrame descendente. Ele não é usado diretamente, mas sim vários outros componentes compostos descer a partir dele.

TcmDataConnector é um componente que detém as informações de conexão de banco de dados para estes outros componentes.

Eu estou usando ModelMaker, e estou tentando implementar um padrão Observer para que vários "Painéis de dados" pode ser atualizado automaticamente sempre que a "Data Connector" muda de estado.

Aqui está o meu problema: Eu não consigo contornar o problema "circular refernece", já que cada classe usa a outra na seção Interface. Colocar a referência associado "usos" na seção Interface de não esclarecer a questão "identificador não declarado", e colocá-los tanto na mesma unidade não quer. Agora eles estão na mesma unidade (eu tentei-los em unidades separadas, e juntos), e eu obter o "identificador não declarado: TcmTPDataConnector" erro.

Como posso resolver isso?

================
UPDATE:

É sexta-feira noite no 9:30 onde eu estou, e eu estava totalmente preso. Minutos apenas depois do meu post, você povo salvou o dia !! (Noite!) OBRIGADO !!

Cara, eu amo StackOverflow .... Então, meu amigo nesta temporada aprendizagem como-louco. :) Obrigado, obrigado, obrigado ...

Foi útil?

Solução

Na mesma unidade, tente o seguinte:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;

Outras dicas

No entanto, outra opção é usar interfaces, mas eu acho que neste caso seria overengineered.

Duas opções:

1) Coloque-os na mesma unidade, o mesmo bloco Tipo dentro dele. Atacante declarar TcmTPDataConnector, declarar o outro tipo e, em seguida, declarar. (Pós See de jcinacio)

2) Faça um antepassado de TcmTPDataConnector que contém o que deve estar disponível externamente e fazer suas referências estar a isso. Esta é mais uma dor de cabeça, mas permite que você faça isso através de múltiplas unidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top