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

时间:2009-08-01 02:12:44

标签: delphi ide packages custom-component

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

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

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

2 个答案:

答案 0 :(得分:30)

问题在于:

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

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

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

答案 1 :(得分:10)

+1 Mason's answer。隐式导入单元成为问题的地方是在一个大型项目中,跟踪从哪个单元链接的单位变得越来越难以跟踪。

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

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