1

у меня есть следующие два класса:Циклическая ссылка вопрос с классами, которые используют друг друга

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 и пытаюсь реализовать шаблон Observer, так что несколько «Панели данных» могут автоматически обновляться всякий раз, когда «Data Connector» изменяет состояние.

Вот моя проблема: я не могу обойти проблему «круглого обратного вызова», так как каждый класс использует другую в разделе «Интерфейс». Помещение ссылки «uses» в разделе «Интерфейс» не устраняет проблему «Необъявленный идентификатор», а также не помещает их в одну и ту же единицу. Сейчас они находятся в одном блоке (я пробовал их в отдельных подразделениях и вместе), и я получаю ошибку «Undeclared identifier: TcmTPDataConnector».

Как я могу обойти это?

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

Это пятницу вечером в 9:30 вечера, где я, и я был полностью застрял. Просто через MINUTES после моего поста, вы, люди, СОХРАНИЛИ ДЕНЬ! (ночь!) СПАСИБО!

Человек, я люблю StackOverflow .... ТАК, мой друг в этом учебном сумасшедшем сезоне. :) Спасибо, спасибо, спасибо ...

ответ

8

На том же блоке, попробуйте следующее:

TcmTPDataConnector = class(TComponent); 


TcmTPDataPanel = class(TcmTPBasePanel) 
    ... 
end; 

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

Это не скомпилирует! Опустить первый (Tкомпонент). Он должен быть = class; –

+0

СПАСИБО, вы оба! :) – Jamo

+0

Они должны быть определены в блоке того же типа. –

2

Два варианта:

1) Положите их в том же блоке, то тот же блок типа внутри него. Вперед объявите TcmTPDataConnector, объявите другой тип и затем объявите его. (См. Сообщение jcinacio)

2) Сделайте предка TcmTPDataConnector, который содержит то, что должно быть доступно снаружи, и сделайте ваши ссылки на это. Это скорее головная боль, но позволяет сделать это через несколько единиц.

3

Еще один вариант - использовать интерфейсы, но я думаю, что в этом случае он будет перегружен.

Смежные вопросы