“无法加载包A,它包含单元X,它也包含在包B中”

时间:2009-07-28 02:08:08

标签: delphi packages custom-component

(更多包装/组件为我安装乐趣 - 感谢大家为您提供的所有帮助)。

我在Delphi 2007中将错误列为标题。包A是我的基于框架的“查看器面板”包。包B是一个包含几个组件的包,用于显示链接到gven数据库(它们的SQL,状态,类类型等)的数据集的信息,其中一个是非可视组件(我们称之为Inspector)创建并调用显示该信息的表单。单位X是该表格的单位。

我将Inspector组件添加到Package中的一个查看器面板,但之后将其删除,并且在项目的View Source中找不到对它的任何引用,也没有在我添加的基于框架的查看器面板的单元中找到它它来。引用隐藏在哪里?

此外,将Inspector组件添加到其中一个视图面板框架(也作为已注册的组件安装)会导致此问题?

这可能与this previous questionthis one有关,但我决定从这个特定的symtpom /问题开始,只是为了保持简洁明了,希望对其他人有用后来。在此先感谢您的帮助。


更新

感谢Loren,我能够找到并删除仍然存在并导致问题的USES引用。但是,我仍然不清楚如何完成我想要完成的任务。 :\这是最新的:

Inspector是一个简单的非可视组件,它包含DataSet属性和内部“Info Form”。调用ShowInfo方法会创建表单,并使用与链接的DataSet相关的各种信息填充该表单。我想用它来调试驱动观众的SQL。

如上所述,Inspector包含在包B中。查看器位于包A中。我想在一些TFrame后代(注册为真正的调色板组件)上使用Inspector组件。当我将该组件放在给定的TFrame上然后使用它,并编译/安装包A时,我得到“无法加载包A,它包含单元X,它也包含在包B中”错误。它现在显然是原因,我可以按需重新创建问题。

以下moobaa的建议是有道理的,然而它似乎即使我试图做出他建议的方法#2,它也行不通。我错过了什么?看起来这应该是可行的,事实上,似乎我见过的大多数软件包一直使用其他已安装的软件包(包括VCL本身)。

注意:据我所知,包B不依赖于包A(我已经单独安装它,因此似乎同意)。

(顺便说一句,是否有任何工具可以“规划”这样的包依赖?我正在使用D2007)

一如既往,感谢您的时间和帮助。

3 个答案:

答案 0 :(得分:8)

它也可能与this question有关。

单位X显然被链接到两个包中。有几种方法可以解决这个问题:

  • 使用Unit X(以及任何其他依赖项)创建一个新包(我们称之为包C),然后将Package A和Package B更改为使用Package C;或...
  • 在包B中包含单元X,并且包A使用包B(这是第一种解决方案的更紧凑形式)。

如果在包B代码中明确提到了查看者,那么包B肯定应该使用包A(,那里应该有明确的依赖关系)。如果未明确指出共享代码的指示,B会将其自己的代码版本编译为B,从而导致您遇到的问题。

现在,如果该依赖项是正常的,那么从包B添加对包A的引用应立即清除此问题;毕竟,B将“使用”包A中的代码,并且相同的单元将不会被编译成两个包。但是,如果这引入了循环引用(我不记得A是否使用B),那么您可能需要进行一些重构:}

答案 1 :(得分:4)

仅仅因为您删除了组件并不意味着您从USES子句中删除了模块名称 - 这些名称不会被自动删除。

答案 2 :(得分:0)

Loren:Requires子句,因为它是.dpk,你不能使用afaik包。

我只是清理$(BDSDIR)/ projects / dir,我自己的项目目录,删除B.dcp和所有dcu用于B中的单位然后重建A。

检查是否有注册的组件依赖于B的另一件事。