1

j'ai les deux catégories suivantes:numéro de référence circulaire avec des classes qui utilisent l'autre

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 (3è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 à la base de données pour ces autres composants. J'utilise ModelMaker et j'essaie d'implémenter un pattern Observer pour que plusieurs "Data Panels" puissent être automatiquement mis à jour chaque fois que le "Data Connector" change d'état.

Voici mon problème: Je n'arrive pas à contourner le problème "circular refernece", car chaque classe utilise l'autre dans la section Interface. Mettre la référence "uses" associée dans la section Interface n'efface pas le problème "Undeclared identifier", et les mettre tous les deux dans la même unité ne le fait pas non plus. À l'heure actuelle, ils sont dans la même unité (je les ai essayés dans des unités séparées, et ensemble), et j'ai l'erreur "Undeclared identifier: TcmTPDataConnector".

Comment puis-je contourner le problème?

================
MISE À JOUR:

Il est vendredi soir à 21h30 où je suis, et je suis tout à fait coincé. Juste MINUTES après mon poste, vous les gens sauvés le jour !! (nuit!) MERCI !!

L'homme, j'adore StackOverflow .... DONC mon ami dans cette saison d'apprentissage-comme-folle. :) Merci, merci, merci ...

Répondre

8

Sur la même unité, essayez ce qui suit:

TcmTPDataConnector = class(TComponent); 


TcmTPDataPanel = class(TcmTPBasePanel) 
    ... 
end; 

TcmTPDataConnector = class(TComponent) 
    ... 
end; 
+0

Ceci ne sera pas compilé! Omettre le premier (Tcomponent). Cela devrait être = class; –

+0

MERCI, vous deux! :) – Jamo

+0

Ils doivent être définis dans le même bloc de type. –

2

Deux options:

1) les mettre dans la même unité, la même bloc de type en son sein. Forward déclare TcmTPDataConnector, déclare l'autre type, puis le déclare. (Voir la publication de jcinacio)

2) Faites un ancêtre de TcmTPDataConnector qui contient ce qui doit être disponible en externe et faites référence à cela. Ceci est plus d'un mal de tête, mais vous permet de le faire à travers plusieurs unités.

3

Encore une autre option est d'utiliser des interfaces, mais je pense que dans ce cas, il serait surexploité.