"隐式导入"在Delphi包中总是一件坏事吗?

Jam*_*amo 19 ide delphi packages custom-component

试图为一组TFrame-descendent组件重新安排我的包,我发现它似乎有必要将我的一些实用程序TFrame后代与使用它们的对话框形式分开,主要是因为前者在调色板中注册为true组件和IDE似乎有时会混淆IDE使用它们的对话框形式.反过来,对话框形式由非可视组件调用,这些组件是第三个包的一部分.这一点,到目前为止,似乎让大多数编译器的依赖性有关的投诉 /混乱走开.(但我还没出来).

当使用对话框窗体(调用框架)编译包时,我收到警告"单元'MyFrames'被隐式导入包'MyDialogForms'"

鉴于它显示为编译器警告,我很久以前就给人的印象是"隐式导入"一个单元通常不是一件好事.是否有特定情况并非如此?即隐含导入单位是否合适,和/或适当的做法?......如果是,那些具体案例是什么?

Mas*_*ler 30

这是问题所在:

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

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

出于某种原因,这是一个警告,而不是错误.只要您了解系统的工作原理,使用隐式导入在技术上是安全的.请记住,无论您是否申报,这些单位都会在包裹中结束.但话又说回来,因为无论你是否声明它们,它们都会在那里结束,只是正式添加它们并为自己省去麻烦可能更简单.

  • (请注意,在包中并不意味着在BPL中.请参阅$ weakpackageunit;) (2认同)

Cob*_*ger 10

梅森的答案 +1 .隐式导入单元成为问题的地方是在一个大型项目中,跟踪从哪个单元链接的单元变得难以指数.

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

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