Frage

Ich habe die folgenden zwei Klassen:

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 (dritte Generation) TFrame Nachkomme. Es ist nicht direkt, sondern mehrere andere zusammengesetzte Komponenten stammen von ihm verwendet.

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

Ich bin mit Modelmaker, und ich versuche, ein Beobachter-Muster zu implementieren, so dass mehrere „Datenfelder“ können automatisch aktualisiert werden, wenn die „Data Connector“ den Zustand ändert.

Hier ist mein Problem: Ich kann nicht um das „zirkuläre refernece“ Problem zu bekommen scheinen, da jede Klasse der andere im Interface-Abschnitt verwendet. Putting die dazugehörige „verwendet“ Referenz im Interface-Abschnitt nicht klärt nicht das „nicht deklarierter Bezeichner“ Thema, und sie beide in der gleichen Einheit setzen tut es auch nicht. Gerade jetzt sind sie in der gleichen Einheit (Ich habe versucht, sie in separaten Einheiten, und zusammen), und ich erhalte den „nicht deklarierter Bezeichner: TcmTPDataConnector“ Fehler.

Wie kann ich dieses Problem umgehen?

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

Es ist Freitagabend um 09.30 Uhr, wo ich bin, und ich war total fest. Nur wenige Minuten nach meinem Post, sparte man die Leute TAG !! (Nacht!) DANKE !!

Man, ich liebe .... SO Stackoverflow meinen Freund in dieser Lern-like-verrückter Saison. :) Danke, danke, danke ...

War es hilfreich?

Lösung

Auf der gleichen Einheit, versuchen Sie wie folgt vor:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;

Andere Tipps

Eine weitere Option ist Schnittstellen zu verwenden, aber ich denke, in diesem Fall wäre es overengineered werden.

Zwei Optionen:

1) Setzen Sie sie in der gleichen Einheit, die gleiche Art Block innerhalb dieser Gruppe. Vorwärts erklären TcmTPDataConnector, die andere Art erklären und es dann erklären. (Siehe jcinacio des post)

2) Machen Sie ein Vorfahre von TcmTPDataConnector das enthält, was extern verfügbar sein muss und Ihre Verweise auf das sein lassen. Dies ist eher Kopfschmerzen, aber können Sie es über mehrere Einheiten tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top