1

次の2つのクラスがあります。

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 は (第 3 世代) TFrame の子孫です。直接使用されるのではなく、複数の他の複合コンポーネントが派生します。

TcmDataConnector は、これらの他のコンポーネントのデータベース接続情報を保持するコンポーネントです。

私は ModelMaker を使用しており、オブザーバー パターンを実装して、「データ コネクタ」の状態が変わるたびに複数の「データ パネル」を自動的に更新できるようにしようとしています。

これが私の問題です。各クラスがインターフェイスセクションで他のクラスを使用しているため、「循環参照」の問題を回避できないようです。関連する「uses」参照を Interface セクションに配置しても、「宣言されていない識別子」の問題は解決されず、両方を同じユニットに配置しても解決されません。現在、それらは同じユニットにあり (別々のユニットで、一緒に試しました)、「宣言されていない識別子: TcmTPDataConnector」エラーが発生します。

どうすればこれを回避できますか?

================
更新:

私がいるのは金曜日の夜の午後 9 時 30 分で、完全に立ち往生していました。私の投稿からわずか数分後、あなたはその日を救った!! (夜!) ありがとう!!

男、私はStackOverflowが大好きです....だから、この学習のようなクレイジーな季節の私の友人です。: ) ありがとう、ありがとう、ありがとう...

4

3 に答える 3

8

同じユニットで、次のことを試してください。

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;
于 2009-03-28T04:14:56.197 に答える
3

さらに別のオプションはインターフェイスを使用することですが、この場合はオーバーエンジニアリングになると思います。

于 2009-03-28T08:54:50.110 に答える
2

2 つのオプション:

1) それらを同じユニット、その中の同じタイプ ブロックに入れます。TcmTPDataConnector を前方宣言し、他の型を宣言してから宣言します。(jcinacioの投稿を参照)

2) 外部で利用可能にする必要があるものを含む TcmTPDataConnector の先祖を作成し、それへの参照を作成します。これは頭​​痛の種ですが、複数のユニットで実行できます。

于 2009-03-28T04:17:08.327 に答える