19

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

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

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

4

2 回答 2

30

这是问题:

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

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

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

于 2009-08-01T03:36:54.893 回答
10

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

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

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

于 2009-08-01T08:05:50.933 回答