1

verwenden Ich habe die folgenden zwei Klassen:Rundreferenz Problem mit Klassen, die einander

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 ist ein (3. Generation) TFrame Nachkomme. Es wird nicht direkt verwendet, sondern es gehen mehrere andere zusammengesetzte Komponenten daraus hervor.

TcmDataConnector ist eine Komponente, die die Datenbankverbindungsinformationen für diese anderen Komponenten enthält.

Ich verwende ModelMaker und versuche ein Observer-Muster zu implementieren, so dass mehrere "Data Panels" automatisch aktualisiert werden können, wenn der "Data Connector" den Status ändert.

Hier ist mein Problem: Ich kann nicht scheinen, um die "circular reference" Problem zu umgehen, wie jede Klasse die andere in der Schnittstelle verwendet. Wenn Sie die verknüpfte Referenz "uses" im Abschnitt "Interface" einfügen, wird das Problem "Undeclared identifier" nicht beseitigt, und beide werden nicht in dieselbe Einheit eingefügt. Im Moment sind sie in der gleichen Einheit (ich habe sie in getrennten Einheiten und zusammen ausprobiert), und ich bekomme den Fehler "Undeclared identifier: TcmTPDataConnector".

Wie kann ich das umgehen?

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

Es ist Freitagabend um 09.30 Uhr, wo ich bin, und ich war total fest. Nur Minuten nach meinem Post, Sie Leute gerettet den Tag! (Nacht!) DANKE !!

Mann, ich liebe StackOverflow .... SO mein Freund in dieser lernen-wie-verrückt-Saison. :) Danke, danke, danke ...

Antwort

8

Auf der gleichen Einheit, versuchen Sie Folgendes:

TcmTPDataConnector = class(TComponent); 


TcmTPDataPanel = class(TcmTPBasePanel) 
    ... 
end; 

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

Dies wird nicht kompilieren! Lassen Sie die erste (T-Komponente) aus. Es sollte = Klasse sein; –

+0

DANKE, euch beide! :) – Jamo

+0

Sie müssen im selben Typblock definiert sein. –

2

zwei Optionen:

1), um sie in der gleichen Einheit Stoßen, die gleicher Typ-Block darin. Forward deklarieren Sie TcmTPDataConnector, deklarieren Sie den anderen Typ und deklarieren Sie ihn anschließend. (Siehe jcinacios Beitrag)

2) Machen Sie einen Vorgänger von TcmTPDataConnector, der enthält, was extern verfügbar sein muss, und machen Sie Ihre Referenzen dazu. Dies ist mehr Kopfschmerzen, aber Sie können es über mehrere Einheiten hinweg tun.

3

Noch eine andere Option ist die Verwendung von Schnittstellen, aber ich denke in diesem Fall wäre es überentwickelt.

Verwandte Themen