Delphi如何使用其他窗体中的类型?

标签 delphi

抱歉,这是一个非常新手的问题。

我们正在维护这个庞大的应用程序。它有5种不同的形式。我们将全局变量放在一个单元(uGlobal)中。但我似乎无法从数据单元(uData)访问它。

我有这个:

Unit uGlobal
type
TmyType: (alpha, beta);
...

Unit uGlobal

Stuff:  TmyType  <- error, undeclared indentifier

当我尝试将 uGlobal 放入 uData 的使用部分时,它提示循环引用。所以,这里有点无知。他们都在同一个项目中。这是使用 BDS 2006。

最佳答案

您有循环引用,因为 uGlobal 中的内容想要使用 uData 中的内容,反之亦然。循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果您有循环依赖,它就会变得更像一个更大的单元。我怀疑在你的项目被认为是大型的之前还有很长的路要走,更不用说“大规模”了。 ;)

您有 2 种可能的解决方案:

  • 采用循环依赖,使一个依赖,而另一个
  • 进行一些重新设计即可完全消除问题。 (把事情分成更小的 block 。)

保持循环依赖

David 已经给出了答案:至少其中一个单元必须使用实现部分中的另一个单元。

  • A 使用 B 使用 A 是绝对不允许的,但是您可以将接口(interface)和实现部分视为几乎本身是独立的单元(具有一堆特殊的引用规则)。
  • 那么问问自己每个子单位需要什么?
  • 如果例如:
    • 您在uData接口(interface)中声明了一个类型,并在uGlobal接口(interface)中引用了该类型,那么uGlobal的接口(interface)需要 uData并且需要相应的uses子句。
    • 如果 uData 实现 中的某个类型在任何 uGlobal 中引用,则必须将 uData 实现 中的该声明移至接口(interface)部分.
    • 如果 uGlobal 接口(interface) 中存在类型,则必须仅从 uData 的实现部分引用该类型,那么在实现部分中使用 use 子句就可以了。
  • 如果您遇到不幸的情况,即在两个接口(interface)部分中都键入了另一个接口(interface)部分中的引用类型,那么您必须通过将该技术应用到来进一步模块化删除循环依赖

删除循环依赖

消除循环依赖需要将您的单元分解为更易于管理的更小的单元。为此,您必须了解应用程序中每个事物之间的依赖关系。 例如:

  • 假设uGlobal声明了A和C
  • A 依赖于 C,但 C 不需要 A
  • 还假设 uData 声明了需要 C 的 B
  • 但事实证明A也需要B
  • 这就是为什么你有循环依赖

在这种情况下,您所要做的就是在移动 C 处声明一个新单位。

  • 然后 uGlobaluData 都将使用 uNewUnit
  • 但两者都不需要对方
  • 您的循环依赖将被完全删除。

免责声明

我并不以任何方式提倡您对 uGlobal 的做法。事实上,这是一个非常糟糕的主意,当您的项目开始变大时,它会在两个方面给您带来很大的麻烦。不幸的是,这个解释本身就是一个巨大的答案。

  • 使用全局变量是危险的,应该避免。
  • 使用 uGlobal 和 uData 等“大型转储单位”也很危险,而且您才刚刚经历过它们的问题。

关于Delphi如何使用其他窗体中的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356485/

相关文章:

delphi - 需要有关 TIdCmdTCPServer 基本使用的帮助

delphi - Indy 9 SMTP 使用 TLS 发送导致崩溃

delphi - this-> Hide()仅工作一次

arrays - 如何创建具有二维或多维数组参数的过程?

delphi - 波形分析仪的组件或代码

delphi - 是否有一个 Delphi 库可以返回项目的所有有效源路径?

Delphi如何在TCanvas上快速绘制TColor的二维数组?

delphi - 检测Skype是否位于 "Compact View"或 "Default View"

windows - 寻找外部窗口的位置?

Delphi:TOleControl 将 ActiveControl 置于错误状态?