【问题标题】:What to NOT do to prevent Delphi from mangling the uses list and {$*.RES} in a .DPR防止 Delphi 在 .DPR 中破坏使用列表和 {$*.RES} 时不应该做什么
【发布时间】:2013-05-22 10:17:36
【问题描述】:

每隔几周,我就会遇到这种情况:在 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.

【问题讨论】:

  • 我也遇到过类似的问题,因为 Delphi 源文件包含 Unix 风格和 Windows 风格的行尾混合。您能否检查您的 .dpr 是否仅包含 Windows 样式的行尾?确保文件的一种简单方法是在记事本(Windows 自己的版本)中打开文件:它只识别 Windows 样式的行尾,所以如果它看起来与在 Delphi 中的不同,那就去吧。
  • 另外,不要在 active 源代码编辑器选项卡中打开 dpr。您可以在另一个选项卡上打开它,但如果它在活动选项卡中打开,我也遇到过类似的问题。
  • 这很好。我不确定它是否在活动标签中打开。
  • 我刚刚检查了我的项目的历史选项卡,所有 .DPR 版本都没有“错误”行结尾(所有行都以 CRLF 结尾)
  • 我认为.dpr文件是否显示在IDE中并不重要

标签: delphi delphi-xe2


【解决方案1】:

我知道唯一可行的方法是让 IDE 管理 .dpr 文件。

  • 不要添加 cmets。
  • 不要使用像 $IFDEF 这样的条件句。
  • 请勿修改 .dpr 文件中的代码。

如果您执行上述任何操作,预计 IDE 会反击。

就我个人而言,我会做所有这些并在提交时进行反击。我使用我的 VCS 来防御虚假的 IDE 更改。这并不理想,但它是最好的选择。

【讨论】:

  • 这是在 IDE 中管理使用列表时(即添加单元、重命名单元等)并且在 .DPR 中没有任何 $IFDEF,因为我很清楚 IDE 拥有.DPR:stackoverflow.com/a/6767221/29290
  • 我和 David 一样:在每个 .DPR 更改上使用 VCS 手动对帐。手动编辑 .DPR 时还有更多陷阱,例如像这样http://qc.embarcadero.com/wc/qcmain.aspx?d=82631
  • 您发布的文件违反了我列表中的所有三个项目。并非所有这样的 mod 都会导致 IDE 悲痛,但你就是不知道它会做什么。
  • 我知道:它是 Delphi XE2 附带的 DUnit 的默认 DUnitTestProjectTemplate.dpr。我可能应该写“没有额外的 IFDEF 或 cmets”。
  • 我在 DPR 中做了很多奇怪的事情。结果,每次我打开我的项目时,我都必须手动打开我的主表单和一个数据模块,这样我就不会丢失其他表单对它们的引用。我将尝试为此使用不同的单位。
猜你喜欢
  • 2010-09-23
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2011-12-25
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多