14

(对我来说更多的包/组件安装乐趣——感谢大家迄今为止的所有帮助)。

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

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

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

这可能与上一个问题这个问题有关,但我决定从这个特定的症状/问题重新开始,只是为了保持简洁明了,希望以后对其他人有用。提前感谢您的任何帮助。


更新:

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

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

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

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

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

(顺便说一句,是否有任何工具可以像这样“绘制”包依赖项?我使用的是 D2007)

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

4

3 回答 3

8

它也可能与这个问题有关

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

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

如果您的包 B 代码中明确提到了查看器,那么包 B 肯定应该使用包 A(,那里应该有一个明确的依赖关系)。如果没有明确表示共享代码,B 会将它自己的代码版本编译到 B 中,从而导致您看到的问题。

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

于 2009-07-28T02:19:46.273 回答
4

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

于 2009-07-28T04:39:15.717 回答
0

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

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

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

于 2009-07-28T10:22:03.043 回答