如何避免Delphi在.DPR文件中搞乱uses列表和{$*.RES},以下是不应该做的事情。

6
每隔几周,我都会遇到这种情况:在 Delphi 项目中对使用的单元进行 IDE 操作时,会破坏 .dpr 文件。

具体情况是重建 uses 列表,但位置错误。

我想知道要避免哪种使用模式,以免再次出现此错误。

我曾在许多 Delphi 版本中遇到过此错误。我知道至少在 Delphi XE2(今天再次发生), XE, 2007, 2006 和 7 中存在该问题。

破碎的片段通常像这样结构化:

ususes
  Forms,
  ..
  LastUnitInUses in 'LastUnitInUses.pas';

R *.RES}

需要进行更正,应该删除一个us并添加一个{$:

uses
  Forms,
  ..
  LastUnitInUses in 'LastUnitInUses.pas';

{R *.RES}

出问题的示例文件:

program SysUtilsFormatTests;
{

  Delphi DUnit Test Project
  -------------------------
  This project contains the DUnit test framework and the GUI/Console test runners.
  Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options
  to use the console test runner.  Otherwise the GUI test runner will be used by
  default.

}

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

ususes
  Forms,
  TestFramework,
  GUITestRunner,
  TextTestRunner,
  SysUtilsFormatUnit in 'SysUtilsFormatUnit.pas';

R *.RES}

begin
  Application.Initialize;
  if IsConsole then
    with TextTestRunner.RunRegisteredTests do
      Free
  else
    GUITestRunner.RunRegisteredTests;
end.

已更正的.dpr文件示例:

program SysUtilsFormatTests;
{

  Delphi DUnit Test Project
  -------------------------
  This project contains the DUnit test framework and the GUI/Console test runners.
  Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options
  to use the console test runner.  Otherwise the GUI test runner will be used by
  default.

}

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  Forms,
  TestFramework,
  GUITestRunner,
  TextTestRunner,
  SysUtilsFormatUnit in 'SysUtilsFormatUnit.pas';

{$R *.RES}

begin
  Application.Initialize;
  if IsConsole then
    with TextTestRunner.RunRegisteredTests do
      Free
  else
    GUITestRunner.RunRegisteredTests;
end.

4
我曾遇到类似的问题,Delphi源文件包含Unix和Windows风格的行尾。你能检查一下你的".dpr"文件是否只包含Windows风格的行尾吗?一个简单的方法是用记事本(Windows自带版本)打开文件:它只识别Windows风格的行尾,所以如果在记事本中显示与在Delphi中不同,那就是问题所在了。 - user743382
1
此外,不要在__active__源编辑器选项卡中打开dpr。您可以在另一个选项卡中打开它,但如果它在活动选项卡中打开,我已经看到了类似的问题。 - Marjan Venema
只是为了确认一下:它确实在第17行设置了“ususes”吗?看起来被吃掉的“{$”最终会出现在这里...你尝试过在单个行中使用“{$IFDEF}{$APPTYPE}{$ENDIF}”吗? - Stijn Sanders
1
我认为在IDE中是否显示.dpr文件并不重要。 - David Heffernan
问题在 Delphi XE6 中也存在。 - Jacek Krawczyk
显示剩余3条评论
1个回答

4
我知道唯一行得通的方法是让IDE管理.dpr文件。
  • 不要添加注释。
  • 不要使用条件编译,如$IFDEF。
  • 不要修改.dpr文件中的代码。
如果你做了这些事情之一,那么请期待IDE的反击。
个人而言,我会做这些事情,并在提交时进行抵抗。我使用我的版本控制系统来防止IDE对代码的错误更改。虽然不是最理想的,但这是最好的选择。

这是在IDE内部管理用户列表时(即添加单元、重命名单元等),而没有在.DPR中使用任何$IFDEF,因为我非常清楚IDE拥有.DPR:https://dev59.com/questions/M1nUa4cB1Zd3GeqPaW0i#6767221 - Jeroen Wiert Pluimers
我和David一样,使用VCS对每个.DPR更改进行手动对账。而且在手动编辑.DPR时还有更多的陷阱,例如这样的http://qc.embarcadero.com/wc/qcmain.aspx?d=82631。 - pf1957
你上传的文件违反了我列表上的三个规定。并非所有这类模块都会导致 IDE 出现问题,但你无法预测它会做什么。 - David Heffernan
我知道:这是随 Delphi XE2 一起发货的 DUnit 的默认 DUnitTestProjectTemplate.dpr。我可能应该写“没有额外的IFDEF或注释”。 - Jeroen Wiert Pluimers
我在我的DPR中做了很多奇怪的事情。因此,每次打开我的项目时,我都必须手动打开我的主窗体和数据模块,以便其他窗体不会失去对它们的引用。我将尝试使用不同的单元来解决这个问题。 - Leonardo Herrera
如果您需要打开一个引用的表单/数据模块以获取其引用,请尝试在.DPR文件中使用子句中的花括号中检查表单/模块的名称。我觉得IDE已经简化了机制,并在缓存的模块中查找引用,如果它们不存在,则扫描在uses子句中定义为注释的名称。 - pf1957

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接