为什么此资源指令显示在可用表单列表中?

Jer*_*dge 2 delphi delphi-xe2

我偶然发现了一些非常特殊的东西.请参阅此屏幕截图:

项目选项>表格

为什么它显示$R *.res在可用表格列表中?这个项目只有两个表单和一个附加单元,这是项目的主要文件源:

program MyProgram;

uses
  Forms,
  uMain in 'uMain.pas' {fMain},
  uEmail in 'uEmail.pas' {frmEmail},
  Vcl.Themes,
  Vcl.Styles,
  Other.Unit in 'Other.Unit.pas';

{$R *.res}

begin
  Application.Initialize;
  TStyleManager.TrySetStyle('Iceberg Classico');
  Application.Title := 'My Program Title';
  Application.CreateForm(TfMain, fMain);
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

PS - 这是稍微修改过的代码,唯一改变的是程序名称,程序标题和其中一个单位(Other.Unit.pas)的名称,我知道这是一个不好的例子,因为它Unit是一个保留字.但原始单元名称具有名称空间前缀,例如此名称.

UPDATE

我按照建议将此RES引用移到uses子句之前.在此之后(并清除所有临时文件,重新启动IDE等),它仍然显示在列表中.但令我惊讶的是,IDE实际上已经添加了这个RES参考!

所以现在IDE已经把它变成了:

UpdateUnit in 'UpdateUnit.pas' {$R *.res};
Run Code Online (Sandbox Code Playgroud)

(UpdateUnit是我给它的新名称所以我不会提供内部信息)

所以,我打开了DPROJ文件并进行了搜索,*.res并确定发现了这个:

<ItemGroup>
        ....
        <DCCReference Include="UpdateUnit.pas">
            <Form>$R *.res</Form>
        </DCCReference>
Run Code Online (Sandbox Code Playgroud)

All*_*uer 10

如上所述,我无法重现这一点......但是,如果我在'Other.unit.pas'"行中的"Other.Unit"之后删除了尾随分号(";"),则显示"$ R*.res"在项目选项中.

就我所知,这不是一个错误.由于您的评论表明所呈现的代码与您使用的代码不同,因此很难诊断.我会尝试解释发生的事情; 如果您查看uMain和uEmail单元,则每个单元旁边都会有一个注释,即表单的名称.由于这些单元实际上可能未在IDE中打开,因此无法知道是否存在与该单元关联的表单.uMain.dfm的存在并不能保证uMain.pas实际上有一个形式(它可能是遗留下来的).IDE将此简单注释放在该单元的uses子句中,以告知项目经理该单元具有表单.

通过删除";",解析器将下一个注释标记视为{$ R*.res}.然后得出结论,Other.Unit.pas必须包含名为"$ R*.res"的表单.它没有验证名称,甚至没有尝试打开单位.它只需要该注释的原始内容并假定它是一个表单名称.

您可以在uses子句之前安全地移动{$ R*.res},以便项目解析器不会将该指令注释混淆为表单.

编辑:从我上面的评论:

可能发生的是这个; 在某些时候,您可能已经编辑了.dpr文件,使得解析器认为"$ R*.res"是表单名称.然后在该状态下保存它,同时将该信息注入.dproj文件.IDE会尝试将这两个内容保持同步,有时会将.dproj文件作为"主"并更新.dpr文件以进行匹配.您应该能够安全地从dproj文件中删除$ R*.res.