【问题标题】:Is "implicitly imported" always a bad thing in Delphi packages?Delphi 包中的“隐式导入”总是一件坏事吗?
【发布时间】:2010-11-15 23:38:14
【问题描述】:

尝试为一组TFrame-descendent components 重新排列我的包,我发现似乎有必要将我的一些实用程序 TFrame 后代与使用它们的对话框表单分开,主要是因为前者已注册到调色板作为真正的组件,这似乎有时会使 IDE 与使用它们的对话框形式混淆。对话表单依次由非可视组件调用,这些组件是第三个包的一部分。 到目前为止,这似乎使编译器的大部分 dependency-related complaints / 困惑消失了。 (不过,我还没出去)。

在使用对话框表单编译包时(调用框架),我收到警告“Unit 'MyFrames' 隐式导入包'MyDialogForms'”

鉴于它显示为编译器警告,我很久以前就有这样的印象,即“隐式导入”一个单元通常不是一件好事。有没有具体情况不是这样的?即隐式导入一个单元是可以的,和/或适当的做法?...如果是这样,那些具体情况是什么?

【问题讨论】:

    标签: delphi ide packages custom-component


    【解决方案1】:

    Mason's answer +1。隐式导入的单元成为问题的地方是在一个大型项目中,跟踪从任何地方链接的单元变得更加困难。

    到目前为止,我发现最好的方法是为每个包创建一个文件夹,该文件夹包含该包的所有文件。如果我看到“隐式导入”警告,我要么添加所需的包,要么将单元添加到包中。因此,所有单元都在包含它们的包中指定,并且它们都在同一个文件夹中。我从不向搜索路径添加文件夹,因为每个项目都直接知道它的所有文件。

    该结构实际​​上并不难维护,它可以保护您免受不同单元包含不同版本文件的问题。

    【讨论】:

    • 这听起来像是一个可靠的建议——我可以试试看!感谢您的回复,科布斯。非常感谢。
    【解决方案2】:

    问题来了:

    您的程序中只能有一个单元的副本。如果您尝试通过包两次加载相同的单元,它将引发异常并且该包不会第二次加载。避免这种情况的方法是构建你的包,以便在一个以上的包中不使用任何单元。

    您编译的每个单元的代码都必须在包中。编译器将从您在 contains 部分中声明的所有单元开始,但这些单元使用的任何其他单元也必须在其中编译,以便可以访问,除非这些单元包含在另一个包中列在需要下。这些额外的东西是“隐式导入”的单位。麻烦的是,它们是隐式导入的,没有在包含部分明确说明,它们会方便地显示在右侧的项目管理器中。这意味着您可能不会注意到您的设备在一个包装中,而最终将其放入另一个包装中。然后,当您尝试运行程序并加载程序包时,事情就会中断。这就是编译器警告你的原因。

    这是一个警告,而不是错误,这是有原因的。只要您了解系统的工作原理,使用隐式导入在技术上是安全的。请记住,无论您是否声明它们,这些单元最终都会出现在包中。但是话又说回来,由于无论您是否声明它们都会最终出现,因此正式添加它们并省去麻烦可能更简单。

    【讨论】:

    • (请注意,在包中并不意味着在 BPL 中。参见 $weakpackageunit;)
    • 梅森 - 谢谢!这是自我的 package sagas 开始以来我读过的最有说服力、最简洁的概念概述。
    • Delphi 如何跨包处理对基本单元(如 SysUtils、Forms 等)的重复引用?看起来这些会导致同样的问题。
    • 将它们放在自己的包中(例如“vcl”和“rtl”),然后你的包需要它们。
    • Maon,我终于解决了这个问题,这主要归功于你的开场白“你的程序中只能有一个单元的副本”,为我的班级/单元绘制图表/package 关系,并找出所有“隐式导入”警告。感谢您在这里的建议和概念性解释。我现在已经明确将您的回答标记为“已接受”。 :) 再次感谢!
    猜你喜欢
    • 2010-09-10
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多