numéro de référence circulaire avec des classes qui utilisent l'autre
-
22-08-2019 - |
Question
Je les deux catégories suivantes:
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 est un (troisième génération) TFrame descendant. Il n'est pas utilisé directement, mais plusieurs autres composants composés en descendent.
TcmDataConnector est un composant qui contient les informations de connexion de base de données pour ces autres composants.
J'utilise ModelMaker, et essaie de mettre en œuvre un observateur modèle de sorte que plusieurs « panneaux de données » peuvent être automatiquement mis à jour chaque fois que le « Data Connector » change d'état.
Voici mon problème: Je ne peux pas sembler contourner le problème « refernece circulaire », chaque classe utilise l'autre dans la section d'interface. Mettre l'associé « utilise » référence dans la section Interface ne disparaît pas la question « identifiant non déclarés », et de les mettre à la fois dans la même unité ne soit. En ce moment, ils sont dans la même unité (je les ai essayé dans des unités séparées, et en même temps), et je reçois le « identificateur undeclared: TcmTPDataConnector » erreur.
Comment puis-je contourner cela?
================
MISE À JOUR:
Il est vendredi soir à 21h30 où je suis, et je suis tout à fait coincé. Situé à quelques minutes après mon post, vous les gens !! JOUR SAUVE (Nuit!) MERCI !!
L'homme, j'aime StackOverflow .... si mon ami dans cette saison folle comme l'apprentissage. :) Merci, merci, merci ...
La solution
Sur la même unité, procédez comme suit:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
Autres conseils
Une autre option est d'utiliser des interfaces, mais je pense que dans ce cas, il serait overengineered.
Deux options:
1) Mettez dans la même unité, le même bloc de type à l'intérieur. Avant de déclarer TcmTPDataConnector, déclarer l'autre type, puis le déclarer. (Voir le poste de jcinacio)
2) Faire un ancêtre de TcmTPDataConnector qui contient ce qui doit être disponible à l'extérieur et de faire vos références soient à cela. Ceci est plus d'un mal de tête, mais vous permet de le faire sur plusieurs unités.