Domanda

Ho le seguenti due classi:

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 è un (3a generazione) TFrame discendente. Non è utilizzato direttamente, ma piuttosto più altri componenti composti discendono da esso.

TcmDataConnector è un componente che contiene le informazioni di connessione al database per questi altri componenti.

sto usando ModelMaker, e sto cercando di realizzare un pattern Observer in modo che più "Pannelli dati" possono essere aggiornati automaticamente ogni volta che la "Data Connector" cambia stato.

Ecco il mio problema: non riesco ad aggirare il problema "circolare refernece", in quanto ogni classe utilizza l'altro nella sezione Interface. Mettere il "usa" riferimento associato nella sezione di interfaccia non chiarire il problema "identificatore non dichiarato", ed entrambi messa nella stessa unità non sia. Per ora sono nella stessa unità (io li ho provato in unità separate, e insieme), e ho la "identificatore non dichiarato: TcmTPDataConnector" errore.

Come posso ottenere intorno a questo?

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

E 'Venerdì sera alle 9:30 pm dove sono, e mi era totalmente bloccato. Pochi minuti dopo il mio post, voi gente salvato la giornata !! (Di notte!) GRAZIE !!

L'uomo, amo StackOverflow .... così il mio amico in questa stagione di apprendimento-like-matto. :) Grazie, grazie, grazie ...

È stato utile?

Soluzione

Sulla stessa unità, provare quanto segue:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;

Altri suggerimenti

Ancora un'altra opzione è quella di utilizzare le interfacce, ma credo che in questo caso sarebbe overengineered.

Due opzioni:

1) Metteteli nella stessa unità, lo stesso blocco di tipo all'interno di esso. Forward dichiarare TcmTPDataConnector, dichiarare l'altro tipo e poi dichiararla. (Vedi post del jcinacio)

2) Fare un antenato di TcmTPDataConnector che contiene ciò che deve essere disponibile esternamente e fare i vostri riferimenti siano a questo. Questo è più di un mal di testa, ma consente di farlo su più unità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top