我有以下两个类:
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模式,以便每当“数据连接器”更改状态时,可以自动更新多个“数据面板”。
这是我的问题:我似乎无法解决“循环引用”问题,因为每个类在接口部分使用另一个。在接口部分中放置关联的“使用”引用不会清除“未声明的标识符”问题,并且将它们放在同一单元中也不会。现在他们在同一个单元(我已经在不同的单元中一起尝试过它们),我得到了“未声明的标识符:TcmTPDataConnector”错误。
我怎样才能解决这个问题?
=====
UPDATE:
这是星期五晚上9点30分,我在那里,我完全陷入困境。在我的帖子发布后,你们节省了一天! (晚上!)谢谢!!
伙计,我喜欢StackOverflow ....所以我的朋友在这个疯狂的学习季节。 :)谢谢,谢谢,谢谢......
答案 0 :(得分:8)
在同一台设备上,尝试以下操作:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
答案 1 :(得分:3)
另一种选择是使用接口,但我认为在这种情况下它会过度设计。
答案 2 :(得分:2)
两个选项:
1)将它们放在同一个单元中,其中包含相同的Type块。转发声明TcmTPDataConnector,声明另一种类型,然后声明它。 (见jcinacio的帖子)
2)创建TcmTPDataConnector的祖先,其中包含外部需要的内容,并使您的引用成为可能。这更令人头痛,但允许您跨多个单位进行。