代码之家  ›  专栏  ›  技术社区  ›  Jamo

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

  •  13
  • Jamo  · 技术社区  · 16 年前

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

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

    我将inspector组件添加到包中的一个查看器面板中,但随后已将其删除,并且在项目的视图源或添加到的基于帧的查看器面板的单元中找不到对它的任何引用。参考资料藏在哪里?

    此外,如何将inspector组件添加到某个视图面板框架(它也作为注册组件安装)中,会导致此问题?

    这可能与 this previous question this one 同样,但是我决定从这个特定的symtpom/问题开始,只是为了使它简洁明了,希望以后对其他人有用。提前感谢您的帮助。


    更新:

    多亏了洛伦,我才找到并删除了导致问题的使用参考。然而,我仍然不清楚如何完成我想要完成的事情。:\以下是最新的:

    Inspector是一个简单的非可视组件,包含一个DataSet属性和一个内部的“信息窗体”。调用ShowInfo方法将创建该窗体,并用与链接的数据集相关的各种信息填充它。我想用它来调试驱动查看器的SQL。

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

    穆巴在下面的建议是有道理的,但它 似乎 尽管我在尝试他建议的方法,但这不起作用。我错过了什么?这似乎是可行的,事实上,我看到的大多数软件包似乎一直在使用其他已安装的软件包(包括VCL本身)。

    注:包B不依赖于包A,据我所知(我已经独立安装了它,所以这似乎是一致的)。

    (顺便说一句,有什么工具可以像这样“绘制”包依赖关系吗?我用的是d2007)

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   Loren Pechtel    16 年前

    仅仅因为删除了组件,并不意味着从uses子句中删除了模块名——这些不会自动删除。

        2
  •  8
  •   Community CDub    8 年前

    也可能与 this question .

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

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

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

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

        3
  •  0
  •   Marco van de Voort    16 年前

    Loren:Requires子句,因为它是.dpk,所以不能使用packages afaik。

    我只需要清理$(b d s dir)/projects/dir,我自己的projects dir来删除b.dcp和b中的单元的所有dcu,然后重建a。

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