代码之家  ›  专栏  ›  技术社区  ›  TridenT

为什么我有了新的单位,“使用单位”就消失了?

  •  4
  • TridenT  · 技术社区  · 14 年前

    我有一个使用dunit框架的应用程序单元测试项目。 这个项目有一个由 $IFDEF 将测试结果输出到XML文件而不是GUI或命令行中。xml_output define通过切换生成配置启用。

    program DelphiCodeToDoc_Tests;
    
    uses
      TestFramework,
      TextTestRunner,
      Sysutils,
      Forms,
      GUITestRunner,
    {$IFDEF XML_OUTPUT}
      XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
    {$ENDIF}
      DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
      ...
    

    这很管用。 问题开始了 当我在这个项目中添加一个新单元时 从IDE(带有“file>new>unit”的新单元)。

    测试项目现在是:

    uses
      TestFramework,
      TextTestRunner,
      Sysutils,
      Forms,
      GUITestRunner,
      DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
      ...
      MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
    

    如您所见,测试XML_输出已消失…每次我添加一个单元时,DelphiIDE都会删除这个测试。

    你知道为什么,我怎样才能避免它吗?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Marcus Adams    14 年前

    无论如何,只有实际使用的代码才会编译到应用程序中,所以通常情况下,在 Uses 未使用的子句。

    在您的IDE中运行程序时,您可以看到链接到应用程序的所有代码。您应该看到所有编译代码旁边的蓝色点。

    唯一需要注意的是,你应该检查 initialization 有关单位的部分。初始化部分中的任何代码都会自动包含在该单元中,因为该部分中的任何代码都会在应用程序启动后立即运行。如果需要,可以将编译器指令添加到该单元的初始化部分,以避免任何初始化代码被链接和运行。

        2
  •  7
  •   gabr    14 年前

    您可以在主程序中添加一个代理单元来绕过这种有问题的行为(我们中的许多人认为这是一个bug,而不是一个特性)。

    program DelphiCodeToDoc_Tests;
    
    uses
      ...
      XMLTestRunnerProxy,  
      ...
    

    unit XMLTestRunnerProxy;
    
    interface
    
    {$IFDEF XML_OUTPUT}
    uses
      XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
    {$ENDIF}
    
    implementation
    
    end.
    
        3
  •  5
  •   Mason Wheeler    14 年前

    DPR的 使用 列表由IDE管理。不幸的是,你对此无能为力。正式地说,你不应该把ifdefs放在朝鲜中央 使用 列出来,因为如果你做的话,它会做这样的事情。

    我要做的是将xmltestrunner2单元留在项目中,并将ifdef放在单元本身中,这样如果没有xml_输出集,它就不会编译任何东西。

        4
  •  5
  •   Zoë Peterson RRUZ    14 年前

    每当IDE必须修改DPR的USES子句时,就会发生剥离。使用“另存为”重命名一个单元也会做同样的事情。

    为了解决这个问题,我总是在外部创建一个空的文本文件,然后手动将它们添加到DPR中。最初的工作要多一些,但如果必要的话,你最终只会把这些单位包括在内。另外请注意,如果您使用的是Delphi2005之后的版本,那么您可以切换到编辑窗格底部的“历史记录”选项卡,并复制“本地文件”内容,以便在添加该单元之前获得该版本,并去除其他所有内容。

    是的,这是一只虫子。 QC#6294 具体来说,它是开放的,所以Embarcadero知道这个问题。

        5
  •  0
  •   mj2008    14 年前

    考虑有两个项目。一次使用可选代码,一次不使用。然后你想做什么就做什么,或者两者兼而有之。使用项目组,它们将很好地工作。

    推荐文章