【问题标题】:Delphi How to use types from other forms?Delphi 如何使用其他形式的类型?
【发布时间】:2011-03-18 18:48:01
【问题描述】:

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

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

我有这个:

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

Unit uGlobal

Stuff:  TmyType  <- error, undeclared indentifier

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

【问题讨论】:

  • +1 非常新手是的,但每个人都必须在某个时候学习。
  • 您的代码示例中的小错误使问题有点混乱。您已将两个单元命名为“uGlobal”。请编辑您的问题以澄清。

标签: delphi


【解决方案1】:

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

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

  • 使用循环依赖,使一个依赖weak,另一个strong
  • 进行一些重新设计以彻底消除问题。 (把事情分解成更小的块。)

保持循环依赖

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

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

移除循环依赖

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

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

在这种情况下,你所要做的就是在 C 步中声明一个新单位。

  • 那么uGlobaluData 都将使用uNewUnit
  • 但谁都不需要对方
  • 您的循环依赖将被完全删除。

免责声明

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

  • 使用全局变量是危险的,应该避免。
  • 使用像 uGlobal 和 uData 这样的“大倾销单位”也很危险,而您只是刚刚经历了他们的问题。

【讨论】:

    【解决方案2】:

    使用第二个“用途”,即“实施”部分中的那个

    unit uData;
    
    uses SysUtils, etc;
    
    type
      etc;
    
    implementation
    
    uses uGlobal;
    
    // here you can reference things in uGlobal
    

    【讨论】:

    • 在实现中已经有对 uGlobal 的引用。有没有办法让 MyType 以某种方式公开?
    【解决方案3】:

    通常大卫齐默尔曼的答案是要走的路,但在你的情况下(根据你对大卫答案的回应),你需要在uGlobal单元的界面部分中使用TMyType;因此将 uData 添加到实施部分的使用子句将无济于事。

    看来是时候重构了;您应该考虑将 TMyType 或 Stuff 移动到第三个单元中,以便 uData 和 uGlobal 都可以引用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 2013-09-27
      • 2010-10-17
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2017-11-08
      • 2014-04-03
      相关资源
      最近更新 更多