当我有一个新单位时,为什么'使用单位'会消失?

Tri*_*enT 4 delphi dunit

我使用DUnit框架为我的应用程序提供了一个单元测试项目.这个项目有一个单元,$IFDEF用于在xml文件而不是gui或just命令行中输出测试结果.通过切换Build配置启用XML_OUTPUT定义.

program DelphiCodeToDoc_Tests;

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
{$IFDEF XML_OUTPUT}
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...
Run Code Online (Sandbox Code Playgroud)

这非常有效.当我从IDE(一个带有'File> New> Unit' 的新单元)向该项目添加一个新单元时,问题就出现了.

测试项目现在是:

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...
  MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
Run Code Online (Sandbox Code Playgroud)

如您所见,测试XML_OUTPUT已消失...每次添加单元时,Delphi IDE都会删除此测试.

你知道我为什么以及如何避免它?

gab*_*abr 7

您可以向主程序添加代理单元以绕过这种有问题的行为(我们许多人认为这是一个错误,而不是一个功能).

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...
Run Code Online (Sandbox Code Playgroud)

unit XMLTestRunnerProxy;

interface

{$IFDEF XML_OUTPUT}
uses
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}

implementation

end.
Run Code Online (Sandbox Code Playgroud)


Mas*_*ler 5

DPR的使用列表由IDE管理.不幸的是,你无能为力.按照官方的说法,你不应该将IFDEF放在DPR的使用列表中间,因为如果你这样做,它会做这样的事情.

我要做的是将XmlTestRunner2单元留在项目中,并将IFDEF放在单元内部,这样如果你没有设置XML_OUTPUT,它就不会编译任何东西.


Mar*_*ams 5

只有实际使用的代码才会被编译到您的应用程序中,因此通常情况下,在Uses子句中使用未使用的单元并不会有什么坏处.

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

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


Zoë*_*son 5

只要IDE必须修改DPR的USES子句,就会发生剥离.使用"另存为"重命名单元将执行相同的操作.

为了解决这个问题,我总是在外部创建新单元作为空文本文件,然后手动将它们添加到DPR中.最初的工作要多一些,但如果必要,你最终只会包含单位.另请注意,如果您在Delphi 2005之后使用任何内容时发生这种情况,您可以切换到编辑窗格底部的"历史记录"选项卡,并复制"本地文件"内容以获取该单元之前的版本被添加,其他一切都被剥夺了.

是的,这是一个错误. QC#6294具体而言,它是公开的,因此Embarcadero意识到了这个问题.